Skip to content

OSD elements for the control, battery and mixer profile names - #11896

Open
Raffi1202 wants to merge 9 commits into
iNavFlight:maintenance-10.xfrom
Raffi1202:feature/profile-name-osd
Open

Raffi1202 wants to merge 9 commits into
iNavFlight:maintenance-10.xfrom
Raffi1202:feature/profile-name-osd

Conversation

@Raffi1202

@Raffi1202 Raffi1202 commented Sep 10, 2026

Copy link
Copy Markdown

Problem

The OSD shows only the number of the active control profile: OSD_ACTIVE_PROFILE draws the profile symbol and the slot number, and there is no element at all for the active battery or mixer profile. Once profiles carry user-defined names (#11894), a pilot still cannot see the active profile by name. No issue is linked.

Cause

src/main/io/osd.c:3301-3302 (maintenance-10.x) formats OSD_ACTIVE_PROFILE as SYM_PROFILE plus getConfigProfile() + 1 only, and osd_items_e in src/main/io/osd.h:383-384 ends at OSD_TERRAIN_AGL (171): no element exists for a profile name or for the battery and mixer profile.

Change

Adds OSD_CONTROL_PROFILE_NAME (172), OSD_BATTERY_PROFILE_NAME (173) and OSD_MIXER_PROFILE_NAME (174); OSD_ITEM_COUNT becomes 175 and the generated enum metadata is refreshed. A new osdFormatProfileName() upper-cases the active slot's name; an empty name prints the symbol (SYM_PROFILE, SYM_BATT_FULL, M) plus slot number so the element never renders blank. The extra items change the row stride of osdLayoutsConfig_t::item_pos, so PG_OSD_LAYOUTS_CONFIG is bumped from 4 to 5 and stored OSD layouts reset once on upgrade. OSD_ACTIVE_PROFILE is unchanged. The name fields come from #11894, on which this branch is based.

Test

SITL: fork run https://github.com/Raffi1202/inav/actions/runs/34445739959 (SITL-WIN at e0799bb), driven by the Configurator counterpart iNavFlight/inav-configurator#2750. MSP2_INAV_OSD_LAYOUTS reports 175 items, an enabled OSD_CONTROL_PROFILE_NAME is stored on the FC and survives re-opening the OSD tab, and the preview shows CRUISE for control_profile_name = Cruise and the symbol plus slot number for an empty name. The latest commit builds all targets and SITL on fork CI: https://github.com/Raffi1202/inav/actions/runs/34765221823. Not run on hardware; the output on a physical display is unverified.

Flash / RAM

Not measured yet. The upstream firmware CI has not been released for this PR, so no size report exists.

Docs

docs/OSD.md: rows 172-174 added to the element table (version 10.0.0).

Raphael Hunziker added 2 commits September 10, 2026 06:37
New string settings control_profile_name, battery_profile_name and
mixer_profile_name (12 characters) stored in the profile structs, and
MSP2_INAV_PROFILE_NAMES that returns the names of all slots in one
reply so a configurator can label its profile selectors. Parameter
group versions bumped for the three grown structs.

Docs regenerated: Settings.md, msp_messages.json (2.1.1), README.
Three OSD elements show the user-defined name of the active control,
battery and mixer profile. An unnamed slot shows the symbol and slot
number instead so the element never renders blank. Builds on the
profile names from the previous commit.
@Raffi1202

Copy link
Copy Markdown
Author

Checked with the CI-built SITL of this branch (fork run https://github.com/Raffi1202/inav/actions/runs/34445739959, inav-9.1.0-ci-20260910-e0799bb_SITL-WIN) through the configurator counterpart iNavFlight/inav-configurator#2750:

  • MSP2_INAV_OSD_LAYOUTS now reports 175 items; the configurator offers the three new elements and hides them on the 9.1 SITL, which reports 172.
  • Enabling OSD_CONTROL_PROFILE_NAME stores the layout item on the FC: after leaving and re-opening the OSD tab the element is still enabled.
  • With control_profile_name = Cruise the configurator preview draws the six characters CRUISE for the element; with an empty name it draws the profile symbol plus slot number, the same fallback the firmware uses.

What the SITL cannot show is the character output of osdFormatProfileName() on a real display; the function mirrors osdFormatPilotName() and copies the terminator because the name array is always terminated.

@qodo-code-review

Copy link
Copy Markdown
Contributor

ⓘ Qodo reviews are paused because the subscription is no longer active. Ask your workspace admin to reactivate the subscription to resume reviews. Manage billing

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Add named profiles to settings, MSP, and OSD

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Stores configurable names for control, battery, and mixer profiles with versioned persistence.
• Exposes all profile names through MSP and renders active names in new OSD elements.
• Hardens and regression-tests parameter-group version checking in CI.
Diagram

graph TD
  Settings["String settings"] -->|stores names| Profiles[("Profile storage")] -->|serializes slots| MSP["MSP names API"] -->|labels selectors| Configurator["Configurator"]
  Profiles -->|reads active slot| OSD["OSD renderer"] -->|renders uppercase| Display["OSD display"]
  Workflow["CI workflow"] -->|runs tests| Checker["PG checker"] -->|validates versions| Profiles
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Split prerequisite changes
  • ➕ Keeps the OSD pull request focused on rendering and element registration
  • ➕ Allows profile storage, MSP protocol, and CI checker changes to be reviewed independently
  • ➕ Matches the stated dependency and integration order
  • ➖ Requires prerequisite pull requests to merge first
  • ➖ Needs a rebase and possible conflict resolution before final review
2. Keep the combined branch
  • ➕ Provides an immediately self-contained implementation
  • ➕ Allows end-to-end review of storage, transport, and presentation together
  • ➖ Mixes unrelated CI checker fixes with the user-facing feature
  • ➖ Increases review scope and obscures which changes belong to each dependency

Recommendation: Merge the shared CI checker fix and profile-name storage/MSP work first, then rebase this branch so it contains only the OSD extension. The underlying design—names stored in each profile, batched through MSP, and formatted centrally for OSD—is appropriate, but separating the prerequisite scopes will reduce review and integration risk.

Files changed (19) +285 / -14

Enhancement (12) +114 / -4
profile_name.hDefine the shared profile-name length limit +25/-0

Define the shared profile-name length limit

• Introduces 'MAX_PROFILE_NAME_LENGTH' as a shared 12-character limit for control, battery, and mixer profile names.

src/main/config/profile_name.h

control_profile.cAdvance control-profile persistence version +1/-1

Advance control-profile persistence version

• Bumps the control profile parameter-group version from 0 to 1 for the added name field.

src/main/fc/control_profile.c

control_profile_config_struct.hPersist a name in each control profile +4/-0

Persist a name in each control profile

• Adds a null-terminated profile-name field using the shared maximum length.

src/main/fc/control_profile_config_struct.h

fc_msp.cSerialize all profile names through MSP +23/-0

Serialize all profile names through MSP

• Adds length-prefixed name serialization and handles 'MSP2_INAV_PROFILE_NAMES'. The response includes the maximum length, slot counts, and names for every control, battery, and mixer profile.

src/main/fc/fc_msp.c

settings.yamlExpose profile names as string settings +18/-0

Expose profile names as string settings

• Defines editable name settings for active control, battery, and mixer profiles. Each setting defaults to empty and is capped by the shared profile-name length.

src/main/fc/settings.yaml

mixer_profile.cAdvance conditional mixer-profile versions +2/-2

Advance conditional mixer-profile versions

• Bumps both mixer-profile persistence variants to account for the new name field, preserving the target-dependent version split.

src/main/flight/mixer_profile.c

mixer_profile.hPersist a name in each mixer profile +2/-0

Persist a name in each mixer profile

• Adds the shared profile-name definition and a null-terminated name field to 'mixerProfile_t'.

src/main/flight/mixer_profile.h

osd.cRender active profile names in the OSD +31/-0

Render active profile names in the OSD

• Adds shared upper-case formatting for profile names and numbered symbol fallbacks for unnamed slots. New draw cases display the active control, battery, and mixer profile names.

src/main/io/osd.c

osd.hRegister profile-name OSD element IDs +3/-0

Register profile-name OSD element IDs

• Appends control, battery, and mixer profile-name elements as IDs 172, 173, and 174 without changing existing element IDs.

src/main/io/osd.h

msp_protocol_v2_inav.hReserve the profile-names MSP command +1/-0

Reserve the profile-names MSP command

• Defines 'MSP2_INAV_PROFILE_NAMES' with protocol identifier '0x2082'.

src/main/msp/msp_protocol_v2_inav.h

battery.cAdvance battery-profile persistence version +1/-1

Advance battery-profile persistence version

• Bumps the battery profile parameter-group version from 4 to 5 for the added name field.

src/main/sensors/battery.c

battery_config_structs.hPersist a name in each battery profile +3/-0

Persist a name in each battery profile

• Adds the shared profile-name definition and a null-terminated name field to 'batteryProfile_t'.

src/main/sensors/battery_config_structs.h

Bug fix (1) +30 / -8
check-pg-versions.shHandle array and conditional PG registrations safely +30/-8

Handle array and conditional PG registrations safely

• Extracts versions from the final registration argument, ignores macro definitions and invalid type matches, and compares every conditional registration between commits. It also fixes the invalid top-level 'local' declaration that could abort the checker.

.github/scripts/check-pg-versions.sh

Tests (1) +20 / -0
test-check-pg-versions.pyAdd regression fixtures for the PG version checker +20/-0

Add regression fixtures for the PG version checker

• Creates temporary Git repositories to test unchanged, missing, increased, array, and conditional parameter-group versions. It verifies expected exit codes and guards against shell integer-expression failures.

.github/scripts/test-check-pg-versions.py

Documentation (4) +106 / -1
OSD.mdDocument the three profile-name OSD elements +3/-0

Document the three profile-name OSD elements

• Lists control, battery, and mixer profile-name elements at IDs 172–174 for INAV 10.0.0.

docs/OSD.md

Settings.mdDocument profile-name string settings +30/-0

Document profile-name string settings

• Adds generated reference entries for the battery, control, and mixer profile-name settings, including their empty defaults and maximum length.

docs/Settings.md

README.mdDocument the profile-names MSP endpoint +19/-0

Document the profile-names MSP endpoint

• Describes command 8322, its count-prefixed profile groups, and length-prefixed name encoding. It also explains how clients set names and retrieve all slots without switching profiles.

docs/development/msp/README.md

msp_messages.jsonAdd the profile-names MSP message specification +54/-1

Add the profile-names MSP message specification

• Bumps the MSP specification patch version to 2.1.1 and defines the request-free profile-name response schema for all profile types.

docs/development/msp/msp_messages.json

Other (1) +15 / -1
pg-version-check.ymlTest the PG checker and harden workflow output handling +15/-1

Test the PG checker and harden workflow output handling

• Runs checker regression tests when checker-related files change and fails incomplete or unexpected checker executions. Multi-line checker output is passed to the comment script through an environment variable to avoid JavaScript syntax errors.

.github/workflows/pg-version-check.yml

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Sep 11, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Saved alternate layouts become corrupt ✓ Resolved 🐞 Bug ≡ Correctness
Description
Adding three members to OSD_ITEM_COUNT increases every row of osdLayoutsConfig_t::item_pos, but
PG_OSD_LAYOUTS_CONFIG remains at version 4. When existing version-4 EEPROM data is loaded,
pgLoad() copies the old matrix contiguously into rows with a larger stride, shifting positions
after the primary layout and filling new slots with bytes from the next layout.
Code

src/main/io/osd.h[R384-386]

+    OSD_CONTROL_PROFILE_NAME, // 172
+    OSD_BATTERY_PROFILE_NAME, // 173
+    OSD_MIXER_PROFILE_NAME, // 174
Evidence
The persisted structure is a four-row matrix whose second dimension is the changed enum count, while
its registration version is unchanged. The loader resets the destination but then overwrites it with
all matching-version saved bytes, without row-aware migration.

src/main/io/osd.h[27-30]
src/main/io/osd.h[452-457]
src/main/io/osd.c[237-238]
src/main/config/parameter_group.c[86-93]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Adding three OSD items changes the row stride of the persisted `osdLayoutsConfig_t::item_pos` matrix. Keeping the existing parameter-group version causes old layout bytes to be interpreted using the new stride.
## Fix Focus Areas
- src/main/io/osd.h[384-386]
- src/main/io/osd.h[452-455]
- src/main/io/osd.c[237-238]
## Recommended Fix
Increment `PG_OSD_LAYOUTS_CONFIG` from version 4 to version 5 so records using the old matrix dimensions are reset instead of copied into the incompatible layout.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Firmware upgrades erase saved profiles 🐞 Bug ≡ Correctness
Description
The PG version increments make pgLoad() reject the previously stored control, battery, and mixer
profile records, because it copies EEPROM data only when the record version exactly matches the
registered version. On the first boot after upgrading from the prior firmware, each affected record
is reset before that failed version check, so existing tuning, battery thresholds, and mixer
configuration all revert to defaults alongside the new empty name.
Code

src/main/fc/control_profile.c[36]

+PG_REGISTER_ARRAY_WITH_RESET_FN(controlConfig_t, MAX_CONTROL_PROFILE_COUNT, controlProfiles, PG_CONTROL_PROFILES, 1);
Evidence
All three changed registrations now use a new version, while the loader resets a group and restores
stored bytes only for an exact version match. The added members are trailing fields, so the prior
serialized prefix is compatible with the unchanged part of each current struct; nevertheless, an
upgrade leaves every old record at reset defaults.

src/main/fc/control_profile.c[34-42]
src/main/sensors/battery.c[116-125]
src/main/flight/mixer_profile.c[72-84]
src/main/config/parameter_group.c[86-93]
src/main/fc/control_profile_config_struct.h[65-70]
src/main/sensors/battery_config_structs.h[159-165]
src/main/flight/mixer_profile.h[33-38]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
Issue description
The profile structs gained only a trailing name field, but incrementing their PG versions makes existing persisted records fail `pgLoad()`'s exact-version check. The loader resets the complete profile before skipping the old record, losing all pre-existing settings rather than initializing only the new name field.
Fix Focus Areas
- src/main/config/parameter_group.c[86-93]
- src/main/fc/control_profile.c[36-36]
- src/main/sensors/battery.c[119-119]
- src/main/flight/mixer_profile.c[72-77]
Recommended Fix
Add a deliberate migration path for the immediately preceding versions of these three profile PGs: retain the serialized prefix containing the old profile fields and leave the appended `name` bytes zero-initialized. Keep the version bumps so newly written records use the updated layouts, but do not reset compatible old records wholesale during this upgrade.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. Generated display metadata stays stale ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
The osd_items_e source now defines values 172–174 and moves OSD_ITEM_COUNT to 175, while both
generated enum artifacts still end with a count of 172. Tooling or protocol consumers generated from
those artifacts receive no symbolic mapping for the new items and retain an invalid upper boundary.
Code

src/main/io/osd.h[R384-386]

+    OSD_CONTROL_PROFILE_NAME, // 172
+    OSD_BATTERY_PROFILE_NAME, // 173
+    OSD_MIXER_PROFILE_NAME, // 174
Evidence
Firmware now serializes the live count of 175, but the repository's generated enum copies omit all
three additions and advertise 172 as the terminal count.

src/main/io/osd.h[381-387]
src/main/fc/fc_msp.c[4807-4817]
docs/development/msp/inav_enums.json[3225-3228]
docs/development/msp/inav_enums_ref.md[4690-4691]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The generated MSP enum artifacts were not refreshed after extending `osd_items_e`, leaving the published item count and mappings inconsistent with firmware.
## Fix Focus Areas
- src/main/io/osd.h[384-387]
- docs/development/msp/inav_enums.json[3225-3228]
- docs/development/msp/inav_enums_ref.md[4690-4691]
## Recommended Fix
Run the repository MSP documentation generator after the enum change and commit the regenerated JSON and Markdown files so they include all three new values and `OSD_ITEM_COUNT` 175.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Some structure changes evade checks ✓ Resolved 🐞 Bug ☼ Reliability
Description
The now-runnable version checker only searches a changed file and its same-basename .c or .h
companion for registrations. A change confined to battery_config_structs.h, for example, never
examines the registration in battery.c, so an omitted storage-version bump passes the workflow.
Code

.github/scripts/check-pg-versions.sh[R211-212]

+    # (this loop runs at top level, so no "local" here: bash would abort the script)
+    companion=""
Evidence
The file-list construction derives only a same-path, same-stem companion, while the repository
defines batteryProfile_t in battery_config_structs.h and registers it in the differently named
battery.c. Existing tests always use the matching pair config.h and config.c, so this path is
untested.

.github/scripts/check-pg-versions.sh[196-229]
.github/scripts/test-check-pg-versions.py[8-16]
src/main/sensors/battery_config_structs.h[100-165]
src/main/sensors/battery.c[116-121]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The repaired checker builds its registration search set using only changed files and same-basename companions. Parameter-group structures and registrations do not always follow that naming arrangement, allowing incompatible structure changes to pass CI.
## Fix Focus Areas
- .github/scripts/check-pg-versions.sh[196-229]
- .github/scripts/test-check-pg-versions.py[3-19]
- src/main/sensors/battery_config_structs.h[100-165]
- src/main/sensors/battery.c[116-121]
## Recommended Fix
Build a repository-wide map from registered structure types to their registration files, then inspect the mapped registration whenever a changed structure is detected. Add a regression fixture where the structure header and registration source have different basenames.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Tip of the day
💡 Did you know, you can start a comment with 'qodo' or '@qodo' to chat about any finding

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread src/main/io/osd.h
Comment thread src/main/io/osd.h
Comment thread .github/scripts/check-pg-versions.sh Outdated
const controlConfig_t *currentControlProfile;

PG_REGISTER_ARRAY_WITH_RESET_FN(controlConfig_t, MAX_CONTROL_PROFILE_COUNT, controlProfiles, PG_CONTROL_PROFILES, 0);
PG_REGISTER_ARRAY_WITH_RESET_FN(controlConfig_t, MAX_CONTROL_PROFILE_COUNT, controlProfiles, PG_CONTROL_PROFILES, 1);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Firmware upgrades erase saved profiles 🐞 Bug ≡ Correctness

The PG version increments make pgLoad() reject the previously stored control, battery, and mixer
profile records, because it copies EEPROM data only when the record version exactly matches the
registered version. On the first boot after upgrading from the prior firmware, each affected record
is reset before that failed version check, so existing tuning, battery thresholds, and mixer
configuration all revert to defaults alongside the new empty name.
Agent Prompt
Issue description

The profile structs gained only a trailing name field, but incrementing their PG versions makes existing persisted records fail `pgLoad()`'s exact-version check. The loader resets the complete profile before skipping the old record, losing all pre-existing settings rather than initializing only the new name field.

Fix Focus Areas
- src/main/config/parameter_group.c[86-93]
- src/main/fc/control_profile.c[36-36]
- src/main/sensors/battery.c[119-119]
- src/main/flight/mixer_profile.c[72-77]

Recommended Fix

Add a deliberate migration path for the immediately preceding versions of these three profile PGs: retain the serialized prefix containing the old profile fields and leave the appended `name` bytes zero-initialized. Keep the version bumps so newly written records use the updated layouts, but do not reset compatible old records wholesale during this upgrade.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Raffi1202 and others added 2 commits September 11, 2026 18:29
Replacing the shell checker with check-pg-versions.py changed the output
format but not the workflow that consumes it, and the two no longer agree.

pg-version-check.yml gates on the output carrying a "### " line:

    if [ "$exit_code" -gt 1 ] || { [ "$exit_code" -eq 1 ] && ! grep -q '^### ' <<< "$output"; }; then

The Python checker printed "PG version issue: ..." with no such line, so on a
genuine finding (exit 1) the grep failed, the step exited 2 before writing
exit_code to GITHUB_OUTPUT, and "Post comment if issues found" never ran. The
check hard-failed instead of leaving the PR comment it exists to leave.

The github-script step has the same dependency from the other side: it starts
capturing at the first line containing "###", so without one the comment body
would have been empty even had the gate passed.

The checker now prints the heading the workflow is written around, splitting
each issue into "### `<name>`" and its detail, which is also what the shell
version produced. Replaying the gate condition: a finding without the heading
aborts with exit 2, with it the step continues and the renderer captures the
full text; a checker error (exit 2) still aborts, as intended.
@Raffi1202

Copy link
Copy Markdown
Author

Evaluated the bot review above against the sources. All four reported findings are either already handled here or do not hold — but the review missed one defect that this pull request introduces, and 995106c0 fixes it.

The one real problem: the check can no longer reach its own comment step

Swapping the shell checker for check-pg-versions.py changed the output format without changing the workflow that consumes it.

pg-version-check.yml gates on a ### line being present:

if [ "$exit_code" -gt 1 ] || { [ "$exit_code" -eq 1 ] && ! grep -q '^### ' <<< "$output"; }; then
  printf '%s\n' "$output"; exit 2
fi

The Python checker printed PG version issue: ... and nothing else. So on a genuine finding — exit code 1, exactly the case this workflow exists for — the grep failed, the step exited 2 before writing exit_code to GITHUB_OUTPUT, and "Post comment if issues found" never ran. The check hard-failed instead of leaving the comment.

The github-script step depends on the same marker from the other side: it starts capturing at the first line containing ###, so the comment body would have been empty even if the gate had passed.

Fixed by having the checker emit the heading the workflow is written around, splitting each issue into ### `<name>` plus its detail — which is also what the shell version produced. Replaying the gate condition confirms it:

case before after
finding, exit 1 aborts with exit 2, no comment continues, comment rendered in full
checker error, exit 2 aborts aborts, unchanged

On the four reported findings

"Saved alternate layouts become corrupt" — already handled. PG_OSD_LAYOUTS_CONFIG is registered at version 5 here, up from 4, which is the correct response to the OSD_ITEM_COUNT 172 → 175 stride change.

"Firmware upgrades erase saved profiles" — the mechanism is right, the conclusion is not. Reset-on-version-mismatch is the intended design; config_eeprom.c:236 says so directly ("pgLoad will handle version mismatch"), no migration framework exists anywhere in src/main/config/, and this repository's own CI fails a PR that changes a PG struct without bumping the version. It is also moot in practice: EEPROM_CONF_VERSION is 126 on release/9.1 and 127 on maintenance-10.x, so isEEPROMContentValid() already discards the whole configuration on any 9.x to 10.x upgrade. Worth a release note, not a code change.

"Generated display metadata stays stale" — already handled; inav_enums.json and inav_enums_ref.md both carry the three new values and OSD_ITEM_COUNT: 175.

"Some structure changes evade checks" — already handled, and this is the point of the rewrite. registrations() now does a repository-wide git grep -l -E 'PG_REGISTER' instead of the old changed-file plus same-basename heuristic, so the exact battery_config_structs.hbattery.c case the bot cited is covered.

Those files belong to iNavFlight#11885, which replaces check-pg-versions.sh with a
Python checker. Carrying a copy here only produces a conflict once either
lands, and it is unrelated to this change.
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