Skip to content

Make Revision in Score properties and About box a clickable URL to the corresponding commit - #33712

Open
Jojo-Schmitz wants to merge 8 commits into
musescore:mainfrom
Jojo-Schmitz:revision-url
Open

Jojo-Schmitz wants to merge 8 commits into
musescore:mainfrom
Jojo-Schmitz:revision-url

Conversation

@Jojo-Schmitz

@Jojo-Schmitz Jojo-Schmitz commented Jun 6, 2026 •

Copy link
Copy Markdown
Contributor
  • Make Revision in Score properties a clickable URL to the corresponding commit
  • Adjust $r Macro replacement to use a similar logic
    No URL in the score though, as that isn't supported yet, see Be able to link clickable URLs in text (especially in exported PDFs) #18055
  • Resolve an old FIXME
  • Make the Revision in the About box a clickable URL too
  • Fixing URL in the About box clipboard
    The old one makes sense on musescore.org, as it automagically turns into a URL there, but it doesn't work on GitHub. The plain number would work on GitHub, but not on musescore.org. This way (using MarkDown syntax) it works on both.
  • Avoid nonsensical link in clipboard
  • Add build date and time to About dialog
  • Cater for MuseScore 3.7 Evolution scores (and link to the corresponding commit)

Comment thread src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp Outdated
@coderabbitai

coderabbitai Bot commented Jun 6, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

We couldn't safely recover the incremental review. No full review was started, and the last reviewed checkpoint was preserved. Retry later, or explicitly request a full review by commenting @coderabbitai full review.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

  • Last reviewed commit: 9d328374a5124eb0411efe48916a45342cf9632c
  • Latest commit, not reviewed: 26b4ecd

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
Walkthrough

Hidden review stack artifact:

Walkthrough

This PR adds a public appRevision() accessor to Score and updates two consumers. Header/footer macro substitution uses appRevision() for dirty scores and applies range-based formatting for clean scores (decimal for 1–5709, hex for >0xffffff, empty for unknown). Project properties and AboutModel now return HTML/Markdown commit links: SourceForge for early 1.x revisions, GitHub for large hex-style revisions, and a localized "Unknown" for other/unrecognized values.

Pre-merge checks: Passed 3 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Description check Warning The description summarizes the intended changes, but it does not follow the required template. It omits the required Resolves: #NNNNN reference and all checklist items, including CLA, title, coding … Update the PR description to use the repository template. Add the resolved issue number or link, complete every applicable checklist item with [x] or [ ], and list AI tools if AI assistance was used.
Passed Passed checks: 3 passed
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title names the main change: the Revision shown in Score properties becomes a clickable URL to the matching commit. The changeset does this in the project properties model. It also covers the Abou…
Full details: Title check

Explanation

The title names the main change: the Revision shown in Score properties becomes a clickable URL to the matching commit. The changeset does this in the project properties model. It also covers the About box, which the title does not mention. The title is 91 characters and 15 words, so it is longer than the short, single-sentence form the guidelines prefer, but it is still specific and accurate.

Full details: Description check

Explanation

The description summarizes the intended changes, but it does not follow the required template. It omits the required Resolves: #NNNNN reference and all checklist items, including CLA, title, coding rules, testing, commit, prior-attempt, and AI-assistance declarations.

Resolution

Update the PR description to use the repository template. Add the resolved issue number or link, complete every applicable checklist item with [x] or [ ], and list AI tools if AI assistance was used.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Warning

Review ran into problems

🔥 Problems

Linked repositories: Your configuration references 1 linked repositories, but your current plan allows 0. Analyzed ``, skipped musescore/muse_framework.git.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/engraving/rendering/score/headerfooterlayout.cpp`:
- Around line 369-370: The else block with the comment around
newFragments.back().text += String(); has inconsistent indentation and fails
codestyle; run the codestyle formatter (tools/codestyle/uncrustify_run_file.sh)
on this source and fix the brace/indentation so the else, comment and statement
align with surrounding blocks, ensuring the comment stays on its own line or is
wrapped consistently and the statement newFragments.back().text += String(); is
properly indented to match surrounding code in headerfooterlayout.cpp.
- Around line 365-371: The numeric bases are swapped when converting rev to text
in headerfooterlayout.cpp: when rev > 0 && rev <= 5709 (SourceForge/decimal) use
String::number(rev, 10) instead of String::number(rev, 16), and when rev >
0xffffff (GitHub/hex) use String::number(rev, 16) instead of String::number(rev,
10); update the two String::number calls in the block that assigns to
newFragments.back().text so they match the convention used in
projectpropertiesmodel.cpp (decimal for SourceForge branch, hex for GitHub
branch), leaving the fallback else branch unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 7e0810fd-71fc-47c2-b671-4d29311a6d91

📥 Commits

Reviewing files that changed from the base of the PR and between 5189660 and 3c42419ddce7a3b72cd429f47ac5c147c2d60152.

📒 Files selected for processing (3)
  • src/engraving/dom/score.h
  • src/engraving/rendering/score/headerfooterlayout.cpp
  • src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp

Comment thread src/engraving/rendering/score/headerfooterlayout.cpp
Comment thread src/engraving/rendering/score/headerfooterlayout.cpp Outdated
@Jojo-Schmitz
Jojo-Schmitz force-pushed the revision-url branch 2 times, most recently from c8d6fa5 to 9d32837 Compare June 6, 2026 16:01

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp (1)

86-98: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add validation for empty or unknown revision in clipboard text.

If application()->revision() returns an empty string or "unknown", the Markdown link will be malformed: [](https://github.com/musescore/MuseScore/commit/). This produces a broken link when pasted into bug reports or forums. Consider adding validation to either omit the link or use plain text when the revision is unavailable.

🛡️ Proposed fix with fallback handling
 void AboutModel::copyRevisionToClipboard() const
 {
+    QString revision = application()->revision();
+    QString revisionText = revision.isEmpty() || revision == "unknown"
+        ? muse::qtrc("appshell/about", "Unknown")
+        : QString("[%1](https://github.com/musescore/MuseScore/commit/%1)").arg(revision);
+
     QApplication::clipboard()->setText(
-        QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: [%6](https://github.com/musescore/MuseScore/commit/%6)")
+        QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: %6")
         .arg(QSysInfo::prettyProductName()
              + ((QSysInfo::productType() == "windows" && (QSysInfo::productVersion() == "10" || QSysInfo::productVersion() == "11"))
                 ? " or later" : ""))
         .arg(QSysInfo::currentCpuArchitecture())
         .arg(QSysInfo::WordSize)
         .arg(application()->version().toString())
         .arg(application()->build())
-        .arg(application()->revision()));
+        .arg(revisionText));
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp` around lines 86 - 98,
AboutModel::copyRevisionToClipboard currently always injects
application()->revision() into a Markdown link which yields a broken URL when
the revision is empty or "unknown"; update this method to validate the revision
string first and, if revision is empty or equals "unknown", format the
"revision" part as plain text (e.g. "revision: unknown" or "revision: <rev>")
instead of the Markdown link; keep using QApplication::clipboard()->setText and
the existing QString assembly but branch on application()->revision() to choose
between the linked form and the plain-text fallback so pasted text never
contains an empty commit URL.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp`:
- Around line 45-48: AboutModel::museScoreRevision currently always builds an
<a> anchor from configuration()->museScoreRevision(), which produces a
malformed/empty link when the revision string is empty or "unknown"; change the
function to first read QString rev =
QString::fromStdString(configuration()->museScoreRevision()), then if
rev.isEmpty() or rev.compare("unknown", Qt::CaseInsensitive) == 0 return a
localized fallback like tr("Unknown") (matching the project properties model),
otherwise return the formatted anchor using rev; ensure you use the same
localization mechanism used elsewhere (tr()) for the fallback text.

---

Outside diff comments:
In `@src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp`:
- Around line 86-98: AboutModel::copyRevisionToClipboard currently always
injects application()->revision() into a Markdown link which yields a broken URL
when the revision is empty or "unknown"; update this method to validate the
revision string first and, if revision is empty or equals "unknown", format the
"revision" part as plain text (e.g. "revision: unknown" or "revision: <rev>")
instead of the Markdown link; keep using QApplication::clipboard()->setText and
the existing QString assembly but branch on application()->revision() to choose
between the linked form and the plain-text fallback so pasted text never
contains an empty commit URL.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0d6f465f-4c3a-4ec4-b767-08e1b6c4934b

📥 Commits

Reviewing files that changed from the base of the PR and between 4e365f8a7f851ba2c060e4ddbecb585339af15a4 and c8d6fa5b950de0b01aed4525b3d6f847bb81cbc6.

📒 Files selected for processing (1)
  • src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp

Comment thread src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp Outdated
@Jojo-Schmitz

Jojo-Schmitz commented Jun 6, 2026 •

Copy link
Copy Markdown
Contributor Author

@coderabbitai, any idea what the codestylecheck is really trying to tell me, i.e. how it really wants the code formatted? Seems a plain white space issue, not visible in the check's output

@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get the check runs for the PR
gh pr checks 33712 --repo musescore/MuseScore 2>/dev/null | head -50

echo "---"
# Get the PR files changed
gh pr diff 33712 --repo musescore/MuseScore 2>/dev/null | head -300

Length of output: 7047


🏁 Script executed:

#!/bin/bash
# Try to get the annotations/details from the failing codestyle check run
gh api repos/musescore/MuseScore/actions/runs/27067497966/jobs --jq '.jobs[] | select(.name | contains("codestyle") or contains("style")) | {name, conclusion, steps: [.steps[] | select(.conclusion == "failure" or .name | contains("style"))]}' 2>/dev/null

echo "=== Check annotations ==="
gh api repos/musescore/MuseScore/check-runs/79890796943/annotations 2>/dev/null | jq '.[] | {path, start_line, end_line, annotation_level, message, title}' 2>/dev/null

echo "=== Job log (last portion) ==="
gh api repos/musescore/MuseScore/actions/jobs/79890796943/logs 2>/dev/null | tail -100

Length of output: 10507



@Jojo-Schmitz: The CI log makes it pretty clear — uncrustify wants two small indentation fixes in src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp:

Fix 1 – .arg( continuation: 10 → 8 spaces

// Current (10 spaces before .arg):
    return QString("<a href=\"https://github.com/musescore/MuseScore/commit/%1\">%1</a>")
          .arg(QString::fromStdString(configuration()->museScoreRevision()));

// Wanted (8 spaces before .arg):
    return QString("<a href=\"https://github.com/musescore/MuseScore/commit/%1\">%1</a>")
        .arg(QString::fromStdString(configuration()->museScoreRevision()));

Fix 2 – adjacent string literal continuation: 14 → 16 spaces

// Current (14 spaces):
        QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: "
              "[%6](https://github.com/musescore/MuseScore/commit/%6)")

// Wanted (16 spaces, aligning the opening " with the one on the line above):
        QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: "
                "[%6](https://github.com/musescore/MuseScore/commit/%6)")

Both are purely indentation — the style checker aligns method-chain continuations at 2× the base indent (8 spaces inside a function body), and expects adjacent string literals to have their " characters column-aligned.

@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Get check runs for this PR
gh pr checks 33712 --repo musescore/MuseScore 2>/dev/null | head -50

echo "---"

# Get the check run details
gh api "repos/musescore/MuseScore/pulls/33712/commits" --jq '.[].sha' 2>/dev/null | head -5

Length of output: 1925


🏁 Script executed:

#!/bin/bash
# Get the diff of the PR to look for whitespace issues
gh pr diff 33712 --repo musescore/MuseScore 2>/dev/null | cat

Length of output: 5523



@Jojo-Schmitz Looking at the diff, there are two indentation/alignment issues in src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp — both are off-by-a-few-spaces continuation-line alignments that clang-format cares about.


Issue 1 — museScoreRevision()

return QString(...) puts Q at column 12 (4 spaces + return ). The .arg continuation needs to align its . under Q, so it needs 11 spaces, not 10:

    return QString("<a href=\"https://github.com/musescore/MuseScore/commit/%1\">%1</a>")
           .arg(QString::fromStdString(configuration()->museScoreRevision()));
//         ^ 11 spaces (was 10)

Issue 2 — copyRevisionToClipboard()

QString(" puts the opening " at column 17 (8 spaces + QString(). The continuation string literal needs to align its " under the first ", so it needs 16 spaces, not 14:

        QString("OS: %1, Arch.: %2, MuseScore Studio version (%3-bit): %4-%5, revision: "
                "[%6](https://github.com/musescore/MuseScore/commit/%6)")
//              ^ 16 spaces (was 14)

Both are classic clang-format alignment requirements: chained method calls align under the start of the expression, and adjacent string literals align their opening quotes. Running clang-format -i src/appshell/qml/MuseScore/AppShell/aboutmodel.cpp locally should fix both automatically.

🐇 ( ´・_・`)

@Jojo-Schmitz
Jojo-Schmitz force-pushed the revision-url branch 2 times, most recently from 93a1e53 to 145379b Compare June 6, 2026 16:34
@Jojo-Schmitz

Copy link
Copy Markdown
Contributor Author

@coderabbitai: thanks, fixed. That codestylecheck's output really needs to get fixed, dropping whitespace from the output is not helpful at all

@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@Jojo-Schmitz Glad it's fixed! And yes, that's a fair complaint — a diff-style formatter that strips leading whitespace defeats its own purpose when whitespace is the diff. Hopefully someone can upstream a fix to make the output preserve indentation (e.g. by using a raw diff block or quoting the lines).

🐇 (ノ◕ヮ◕)ノ*:・゚✧


🧠 Learnings used
Learnt from: juli27
Repo: musescore/MuseScore PR: 33052
File: src/framework/uicomponents/qml/Muse/UiComponents/sorter.h:40-41
Timestamp: 2026-04-18T17:21:42.477Z
Learning: In the MuseScore codebase, the trailing semicolon on `QML_ELEMENT;` is required by the project's Uncrustify configuration. Do not flag it as a style issue or inconsistency.

Learnt from: luapmartin
Repo: musescore/MuseScore PR: 32861
File: src/framework/multiwindows/tests/environment.cpp:27-34
Timestamp: 2026-03-31T10:32:15.267Z
Learning: In the MuseScore project (C++), the formatting style for `static muse::testing::SuiteEnvironment` initializations with an opening brace on its own line and closing parenthesis aligned to the left (as seen in `src/framework/multiwindows/tests/environment.cpp`) is acceptable and passes the project's codestyle checks. Do not flag this pattern as a formatting issue.

If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

@Jojo-Schmitz Jojo-Schmitz changed the title Make Revision in Score properties a clickable URL to the corresponding commit Make Revision in Score properties and About box a clickable URL to the corresponding commit Jun 6, 2026
Comment thread src/engraving/rendering/score/headerfooterlayout.cpp Outdated
Comment thread src/project/qml/MuseScore/Project/internal/Properties/projectpropertiesmodel.cpp Outdated
if (rev > 0 && rev <= 5709) { // MuseScore 1.x and earlier used decimal numbers, referring to a commit on SourceForge.net, the largest being 5709
revision = QString("<a href=\"https://sourceforge.net/p/mscore/code/%1/\">%1</a>").arg(QString::number(rev, 10));
} else if (rev > 0xffffff) { // MuseScore 2.0 and later use a >= 7-digit hex SHA, referring to a commit on GitHub.com
revision = QString("<a href=\"https://github.com/musescore/MuseScore/commit/%1\">%1</a>").arg(QString::number(rev, 16));

@Jojo-Schmitz Jojo-Schmitz Jun 7, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

May want to cater for my 3.7 Evolution here, something like

        revision = QString("<a href=\"https://github.com/%1/MuseScore/commit/%2\">%2</a>").arg(m_projectMetaInfo.musescoreVersion = "3.6.3" ? "Jojo-Schmitz" : "musescore", QString::number(rev, 16));

but I don't know whether that'd pass muster?

@Jojo-Schmitz
Jojo-Schmitz force-pushed the revision-url branch 3 times, most recently from f7ab221 to 353e332 Compare June 7, 2026 17:24
@Jojo-Schmitz

Copy link
Copy Markdown
Contributor Author

@coderabbitai: what's the stylecheck issue now?

}

return revision;
// unknown, like in a self-built development version, or in a very old version of MuseScore before the revision number was tracked
return muse::qtrc("global", "Unknown");

@Jojo-Schmitz Jojo-Schmitz Aug 10, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Not sure we'd want a translated text getting placed in the score's metadata?

And is inconsistent vs. how it is dealt with for header/footer

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm - if I understand you correctly this doesn't actually modify the score's metadata though? It's purely used for UI purposes in the project properties dialog when we encounter a revision we don't recognise.

@Jojo-Schmitz Jojo-Schmitz Aug 10, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Isn't the revision also written into the score?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It is, but not using this method (it uses application()->revision() see here).

@Jojo-Schmitz Jojo-Schmitz Aug 11, 2026 •

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Ah, I see, you're right.

Remaining question is whether to convert an unknown revision number for header/footer, it might be better to not even try (and print "0" in almost all cases, or some arbitrary and meaningless number between 5710 and 0xfffffe) and just print nothing instead?

Jojo-Schmitz added a commit to Jojo-Schmitz/MuseScore that referenced this pull request Aug 11, 2026
@Jojo-Schmitz

Jojo-Schmitz commented Aug 11, 2026 •

Copy link
Copy Markdown
Contributor Author

There's still an issue: both revision URLs (in Score Properties and About) are not clickable, i.e. don't open the URL in a browser, which is pretty much the main point of this PR.

In my 3.x version I had to add this (in AboutBox.ui and metaedit.ui)

             <property name="openExternalLinks">
              <bool>true</bool>
             </property>

and additionally add that Qt::LinksAccessibleByMouse| (in metaedit.ui):

        <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>

No idea what the corresponding mechanics in a .qml file (AboutDialog.qml and ProjectPropertiesFileInfoPanel.qml ?) would be

@Jojo-Schmitz

Copy link
Copy Markdown
Contributor Author

Rebased and including the latest muse_framworks, which is a prerequisite for having URLs work

@Jojo-Schmitz
Jojo-Schmitz requested a review from avvvvve August 28, 2026 08:38
@mathesoncalum
mathesoncalum removed the request for review from avvvvve August 31, 2026 07:38
Jojo-Schmitz added a commit to Jojo-Schmitz/MuseScore that referenced this pull request Sep 5, 2026
@Jojo-Schmitz

Jojo-Schmitz commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor Author

Needs a rebase, bit-rot, for not having been merged regardles of 2 approvals 2 months ago...

@Jojo-Schmitz

Jojo-Schmitz commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor Author

Possible (IMHO usefull) addition: turn the URLs in Project properties source (to the score on musescore.com) and audioComUrl (to the score on audio.com) into clickable ones too.

@Jojo-Schmitz

Copy link
Copy Markdown
Contributor Author

Seems the rebase didn't go well, all builds are failing, @coderabbitai?

@coderabbitai

coderabbitai Bot commented Oct 29, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
repo=musescore/MuseScore
gh pr view 33712 --repo "$repo" --json headRefOid,baseRefOid,headRefName,updatedAt,url
sha=$(gh pr view 33712 --repo "$repo" --json headRefOid --jq .headRefOid)
echo "=== Current checks ==="
gh pr checks 33712 --repo "$repo" || true
echo "=== Current workflow runs and jobs ==="
gh api "repos/$repo/actions/runs?head_sha=$sha&per_page=100" --jq '.workflow_runs[] | [.id,.name,.status,.conclusion,.html_url] | @tsv'
gh api "repos/$repo/actions/runs?head_sha=$sha&per_page=100" --jq '.workflow_runs[] | select(.conclusion == "failure") | .id' |
while read -r run; do
  echo "=== Failed run $run ==="
  gh api "repos/$repo/actions/runs/$run/jobs?per_page=100" --jq '.jobs[] | {id,name,conclusion,html_url,failed_steps:[.steps[] | select(.conclusion=="failure") | {name,number}]}'
done
echo "=== Changed files ==="
gh pr diff 33712 --repo "$repo" --name-only

Length of output: 5278


🏁 Script executed:

#!/bin/bash
set -euo pipefail
repo=musescore/MuseScore
for job in 123579076457 123579074127 123579074664 123579075593 123579235440; do
  echo "=== Job $job error context ==="
  logfile=$(mktemp)
  if gh api "repos/$repo/actions/jobs/$job/logs" > "$logfile"; then
    rg -n -i -C 7 'fatal error|error:|error C[0-9]+|CMake Error|could not find|not found|FAILED:|conflict|does not contain|unknown CMake command' "$logfile" | head -200 || true
    echo "=== Log tail ==="
    tail -35 "$logfile"
  fi
  rm -f "$logfile"
done
echo "=== PR diff ==="
gh pr diff 33712 --repo "$repo"

Length of output: 11791


🏁 Script executed:

#!/bin/bash
set -euo pipefail
repo=musescore/MuseScore
for job in 123579076457 123579074127 123579074664 123579075593 123579235440; do
  echo "=== Job $job ==="
  logfile=$(mktemp)
  if gh api --allow-escape-sequences "repos/$repo/actions/jobs/$job/logs" > "$logfile"; then
    sed -i -E 's/\x1B\[[0-9;]*[[:alpha:]]//g' "$logfile"
    rg -n -i -C 6 'fatal error|error:|error C[0-9]+|CMake Error|could not find|not found|FAILED:|does not contain|unknown CMake command' "$logfile" | head -180 || true
    echo "=== Tail ==="
    tail -25 "$logfile"
  fi
  rm -f "$logfile"
done

Length of output: 63991


🏁 Script executed:

#!/bin/bash
set -euo pipefail
repo=musescore/MuseScore
head=2c943313f455e4a5daf8e841392f34b746a4badb
base=2f26f6604d407edfcd3f4c5cadd94c051cc172d2
echo "=== CMake include ==="
gh api -H 'Accept: application/vnd.github.raw+json' "repos/$repo/contents/CMakeLists.txt?ref=$head" | sed -n '20,40p'
echo "=== Submodule metadata ==="
meta=$(gh api "repos/$repo/contents/muse?ref=$head")
echo "$meta" | jq '{path,sha,submodule_git_url,html_url}'
framework=$(echo "$meta" | jq -r '.submodule_git_url' | sed -E 's#https://github.com/##; s#git@github.com:##; s#\.git$##')
for sha in c855971cd24fbd6081b7b0ac8efd64a758e0dabe ecdc6e7ef87b41c3fd2ce4e9df39343640862c4f; do
  echo "=== Framework $sha ==="
  gh api "repos/$framework/commits/$sha" --jq '{sha,date:.commit.committer.date,message:.commit.message}'
  gh api "repos/$framework/git/trees/$sha?recursive=1" --jq '{truncated,matches:[.tree[] | select(.path | endswith("SetupMacOSDeploymentTarget.cmake")) | {path,sha}]}'
done
echo "=== Framework comparison: base pointer to PR pointer ==="
gh api "repos/$framework/compare/ecdc6e7ef87b41c3fd2ce4e9df39343640862c4f...c855971cd24fbd6081b7b0ac8efd64a758e0dabe" --jq '{status,ahead_by,behind_by,total_commits}'
echo "=== Base submodule pointers ==="
for path in muse muse_deps; do
  gh api "repos/$repo/contents/$path?ref=$base" --jq '{path,sha}'
done

Length of output: 3512


@Jojo-Schmitz Yes—the rebased branch rolls back the muse submodule by 307 commits. This causes the shared build failure.

Linux x64, macOS, Windows, unit tests, and the visual-test build all report:

CMake Error at CMakeLists.txt:33 (include):
  include could not find requested file:
    .../muse/buildscripts/cmake/SetupMacOSDeploymentTarget.cmake

The framework pointers explain the error:

Revision muse commit Required file
PR base ecdc6e7ef87b — October 27 Present
Rebased branch c855971cd24f — August 27 Missing

The August commit added the URL-opening support you needed. The base framework commit already includes that commit, so you do not need to retain the older pointer.

Restore muse to the framework commit recorded by the PR base: ecdc6e7ef87b41c3fd2ce4e9df39343640862c4f.

The PR also changes muse_deps from 436c66732637 to 31ad619b85f5. Unless that change is intentional, restore the base pointer for muse_deps too. I have not established that it causes a separate failure.

This is different from the earlier Actions incident: jobs start, but CMake configuration fails before compilation. Codestyle passes. After correcting the submodule pointers, fresh CI runs must confirm whether any further errors remain.

You are interacting with an AI system.

@Jojo-Schmitz

Jojo-Schmitz commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor Author

None of these changes to the 2 submodules were intended...
Edit: actually they were intended back than, to make URLs work in the first place, just need to get updated along with the rebase.
Let's update to the latest

Jojo-Schmitz and others added 5 commits October 29, 2026 17:52
Update muse_Framwork, as a prerequisite for having URLs work
the old one makes sense on musescore.org, as it automagically turns into a URL there, but it doesn't work on GitHub. This way it works on both.

This branch has not been deployed

No deployments
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.

4 participants