CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

CI: Notify open PRs that conflict on uv.lock after main merges - #65765

Merged
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts
Apr 25, 2026
Merged

CI: Notify open PRs that conflict on uv.lock after main merges#65765
potiuk merged 2 commits into
apache:mainfrom
potiuk:notify-uv-lock-conflicts

Conversation

@potiuk

Copy link
Copy Markdown
Member

When `uv.lock` moves on `main`, any open PR that also touches `uv.lock` usually ends up with a rebase conflict. This workflow closes that feedback loop: on every push to `main` that modifies `uv.lock`, scan open non-draft PRs (updated in the last 14 days), find those currently conflicting, and post — or update in place, deduped via an HTML-comment marker — a single nudge with the exact rebase + `uv lock` commands.

The source PR that caused the `uv.lock` change is resolved from the squash-merge commit headline's trailing `(#NNN)` and linked in the notice; falls back to the commit URL when no match.

Summary

  • Workflow (`.github/workflows/notify-uv-lock-conflicts.yml`): path-filtered to `uv.lock` on `main`; installs `uv` from `uv.lock` (same pattern as `scheduled-verify-release-calendar.yml`) and runs the script.
  • Script (`scripts/ci/notify_uv_lock_conflicts.py`): standalone PEP 723 (`httpx`, Python ≥ 3.10). One paginated GraphQL query for PR list + files + comments + mergeable, plus a retry loop (5 × 30 s) for PRs whose `mergeable` is still `UNKNOWN` after the initial 30 s settle. Writes a diagnostics table to `GITHUB_STEP_SUMMARY`.
  • Unit tests (`scripts/tests/ci/test_notify_uv_lock_conflicts.py`): 29 tests covering the commit-regex, classifier, pagination early-exit on stale, UNKNOWN retry behaviour, and create-vs-update notice posting. Run with `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py`.

Test plan

  • `uv run --project scripts pytest scripts/tests/ci/test_notify_uv_lock_conflicts.py` — 29 passed
  • `uv run ruff format / check --fix` on all three files — clean
  • `prek run --from-ref upstream/main --stage pre-commit` via commit hook — all applicable hooks passed
  • First real run on `main` after merge — confirm the notice renders with a source-PR link and dedupe marker

Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (via Claude Code, auto mode)

Generated-by: Claude Opus 4.7 following the guidelines

When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
@potiuk
potiuk merged commit 4fae29c into apache:mainApr 25, 2026
253 of 255 checks passed
@potiuk
potiuk deleted the notify-uv-lock-conflicts branch April 25, 2026 19:21
@github-actions

Copy link
Copy Markdown
Contributor

Backport successfully created: v3-2-test

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

StatusBranchResult
v3-2-testPR Link

potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
potiuk added a commit that referenced this pull request Apr 26, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Apr 27, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request May 20, 2026
…erges (#65765) (#65851)
* CI: Notify open PRs that conflict on uv.lock after main merges
When `uv.lock` changes on `main`, open PRs that touch `uv.lock` frequently
end up with rebase conflicts. This adds a workflow that, on each push to
`main` that modifies `uv.lock`, scans open non-draft PRs (updated in the
last 14 days), identifies those currently reporting conflicts, and posts
(or updates, deduped via an HTML-comment marker) a single comment with
rebase-and-`uv lock` instructions.
The source PR that caused the change is resolved from the squash-merge
commit headline's trailing `(#NNN)` and linked in the notice.
Implemented as a standalone PEP 723 Python script (`httpx` + GitHub's
GraphQL API) so logic stays testable; workflow YAML is a thin driver that
installs `uv` from `uv.lock` and runs the script. Unit tests cover the
regex, classifier, pagination/early-exit, UNKNOWN-mergeable retry loop,
and notice posting.
* Fix scripts-tests by stubbing httpx in unit-test module
The scripts-project CI venv doesn't have httpx installed, so importing
``notify_uv_lock_conflicts`` fails with ``ModuleNotFoundError: No module
named 'httpx'`` before any test runs. httpx is a PEP 723 runtime dep of
the script; the tests mock the client and never need the real library.
Stub ``httpx`` in ``sys.modules`` with ``setdefault`` before loading the
module under test: keeps the scripts distribution's declared deps
unchanged, and leaves real ``httpx`` alone when present (e.g. in the
workspace-wide dev environment).
(cherry picked from commit 4fae29c)
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@potiuk@jscheffl