Fix: Preserve manually added labels during workflow run and refine label sync logic#917
Conversation
There was a problem hiding this comment.
Pull request overview
This PR enhances the labeler action to preserve labels that are manually added or added by other bots during the workflow execution, addressing issue #908. The key improvement is fetching the latest PR labels before applying changes, merging them with config-based labels, and ensuring accurate outputs.
- Fetches latest PR labels to detect manual additions during workflow execution
- Merges manually added labels with config-based labels while respecting the 100-label limit
- Updates the 'all-labels' output to reflect the final applied labels
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated 7 comments.
| File | Description |
|---|---|
| src/labeler.ts | Implements label fetching and merging logic to preserve manually added labels, updates output to use final applied labels |
| dist/index.js | Compiled/bundled version of the TypeScript changes with identical logic updates |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
… labels are prioritized
jnewland
left a comment
There was a problem hiding this comment.
#908 describes a lost update where a user-added label is removed because a setLabels call is made without knowledge of the user-added label. My read of this PR is that it reduces the window of time during which updates can be lost but it does not in any way prevent those lost updates from happening.
I don't believe that ANY approach using setLabels can fix the lost-update problem introduced by #497: setLabels replaces the entire label set in a single write operation, discarding any label changes made since the last read. If concurrent changes are made between the read and write steps - by a user or another workflow - those updates will be overwritten and lost.
I believe the only path towards removing the ability of this action to clobber user writes is to rework it to use addLabels and removeLabels as it did before #497.
|
Hi @jnewland , We understand the familiarity with the earlier POST + DELETE approach. After revisiting the long-standing reliability challenges documented in PR #497, we’ve chosen to continue with the setLabels (PUT-based bulk update) method because it offers a more stable and predictable foundation for large or high-activity repositories. Why we rely on setLabels (PUT)The previous incremental approach worked for smaller workflows, but at scale it introduced several issues:
These problems were significant enough that PR #497 replaced POST/DELETE with a single PUT-based update. Why PUT is more reliable
This aligns better with the concurrency patterns common in GitHub Actions. How PR #917 improves this furtherPR 917 narrows the read–write race window, preserves manually added labels more consistently, and improves workflow stability when updates happen mid-run. We truly appreciate your feedback and are open to further discussion on improving label synchronization within the constraints of GitHub’s API. |
|
Thanks for the update. I had forgotten that the label delete API only allows one label to be removed at a time; that's disappointing. |
|
Hi all - it looks like this has been merged but not yet released. Would it be possible to have a new release some time soon for this change to be available? Thank you for your work on this action! ❤️ |
The previous pin (v6.0.1, 634933e) has a bug where labels added by other workflows during the same run can be removed even with sync-labels: false. This caused Needs-Restricted-Paths-Review to be stripped immediately after being applied (see #1967). Pin to e52e4fb which includes the fix from actions/labeler#917 ("Preserve manually added labels during workflow run and refine label sync logic").
The previous pin (v6.0.1, 634933e) has a bug where labels added by other workflows during the same run can be removed even with sync-labels: false. This caused Needs-Restricted-Paths-Review to be stripped immediately after being applied (see #1967). Pin to e52e4fb which includes the fix from actions/labeler#917 ("Preserve manually added labels during workflow run and refine label sync logic").
…v6.0.1 → v6.1.0) (#384) This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [https://github.com/actions/labeler](https://github.com/actions/labeler) | action | minor | `v6.0.1` → `v6.1.0` | --- ### Release Notes <details> <summary>actions/labeler (https://github.com/actions/labeler)</summary> ### [`v6.1.0`](https://github.com/actions/labeler/releases/tag/v6.1.0) [Compare Source](actions/labeler@v6.0.1...v6.1.0) #### Enhancements - Add changed-files-labels-limit and max-files-changed configuration options to cap the number of labels added by [@​bluca](https://github.com/bluca) in [#​923](actions/labeler#923) #### Bug Fixes - Improve Labeler Action documentation and permission error handling by [@​chiranjib-swain](https://github.com/chiranjib-swain) in [#​897](actions/labeler#897) - Preserve manually added labels during workflow runs and refine label synchronization logic by [@​chiranjib-swain](https://github.com/chiranjib-swain) in [#​917](actions/labeler#917) #### Dependency Updates - Upgrade brace-expansion from 1.1.11 to 1.1.12 and document breaking changes in v6 by [@​dependabot](https://github.com/dependabot) in [#​877](actions/labeler#877) - Upgrade minimatch from 10.0.1 to 10.2.3 by [@​dependabot](https://github.com/dependabot) in [#​926](actions/labeler#926) - Upgrade dependencies ([@​actions/core](https://github.com/actions/core), [@​actions/github](https://github.com/actions/github), js-yaml, minimatch, [@​typescript-eslint](https://github.com/typescript-eslint)) by [@​Copilot](https://github.com/Copilot) in [#​934](actions/labeler#934) #### New Contributors - [@​chiranjib-swain](https://github.com/chiranjib-swain) made their first contribution in [#​897](actions/labeler#897) - [@​bluca](https://github.com/bluca) made their first contribution in [#​923](actions/labeler#923) - [@​Copilot](https://github.com/Copilot) made their first contribution in [#​934](actions/labeler#934) **Full Changelog**: <actions/labeler@v6...v6.1.0> </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9naXRodWItYWN0aW9uIiwidHlwZS9taW5vciJdfQ==--> Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/384
|
Hi @melissawm! 👋 |
Description:
This pull request updates the
labelerfunction to improve how labels are managed and applied to pull requests, especially when labels may have been added manually or by other bots during the workflow run.Label management improvements:
GITHUB_MAX_LABELS).all-labelsnow reflects the final set of labels actually applied to the pull request, ensuring outputs are accurate and up-to-date..Related issue:
(#908 , #763).
Check list: