Skip to content

fix(bluetooth): align audio device icon with taskbar - #3407

Open
caixr23 wants to merge 1 commit into
linuxdeepin:masterfrom
caixr23:fix/bug-275675-bluetooth-audio-icon
Open

fix(bluetooth): align audio device icon with taskbar#3407
caixr23 wants to merge 1 commit into
linuxdeepin:masterfrom
caixr23:fix/bug-275675-bluetooth-audio-icon

Conversation

@caixr23

@caixr23 caixr23 commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

修复 BUG-275675:连接蓝牙音箱时任务栏与控制中心设备图标不一致

改动内容(2 文件 2 行)

  1. bluetoothdevice.h: 将 audio-headphones 的图标映射从 bluetooth_headset 改为 bluetooth_pheadset,与 audio-cardaudio-headset 保持一致,消除控制中心与任务栏蓝牙列表的图标不一致。

  2. bluetoothworker.cpp: 修复 BluetoothWorker::connectDevice 中音频设备类型判断错误。deviceType() 返回的是映射后的值(如 bluetooth_pheadset),原代码比较原始值 audio-headset/audio-headphones 永远不匹配,导致音频设备防重复连接优化从未生效。改为比较映射后的 bluetooth_pheadset/bluetooth_headset

PMS Bug

https://pms.uniontech.com/bug-view-275675.html

代码审核

已通过 multica 代码审核(标准-代码审核bot),审核报告确认改动正确、安全、低风险。

跨仓库遗留

dde-tray-loader 的 deviceType2Icon 同样缺少 audio-headset/audio-headphones 条目,导致任务栏侧仍回退 bluetooth_other。此为另一仓库的后续跟进项,不影响本 patch。

Log: 修复连接蓝牙音箱时控制中心与任务栏设备图标不一致问题,统一音频设备图标映射并修复音频设备连接判断逻辑

Bug: https://pms.uniontech.com/bug-view-275675.html

Summary by Sourcery

Align Bluetooth audio device handling so taskbar and control center use consistent icons and prevent redundant connections for mapped audio device types.

Bug Fixes:

  • Correct audio headphones icon mapping to use the same headset icon as other audio devices, ensuring consistent display across UI surfaces.
  • Fix audio device duplicate-connection prevention by comparing against mapped Bluetooth audio device types instead of unmapped values.

@sourcery-ai

sourcery-ai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

This PR fixes a Bluetooth audio device icon mismatch between the control center and taskbar and restores the duplicate-connection guard for audio devices by aligning icon mappings with the device type values used in connection logic.

Sequence diagram for BluetoothWorker::connectDevice audio device duplicate-connection guard

sequenceDiagram
    actor User
    participant ControlCenter
    participant BluetoothWorker
    participant BluetoothAdapter
    participant BluetoothDevice

    User ->> ControlCenter: requestConnect(deviceId)
    ControlCenter ->> BluetoothWorker: connectDevice(deviceId, adapterPath)
    BluetoothWorker ->> BluetoothAdapter: deviceById(deviceId)
    BluetoothAdapter -->> BluetoothWorker: BluetoothDevice

    alt [device exists and is audio headset/phones]
        BluetoothWorker ->> BluetoothDevice: deviceType()
        BluetoothWorker ->> BluetoothDevice: state()
        note over BluetoothWorker,BluetoothDevice: deviceType == bluetooth_pheadset or bluetooth_headset
        BluetoothWorker -->> ControlCenter: return (skip duplicate connect)
    else [other device types or states]
        BluetoothWorker ->> BluetoothWorker: connectDeviceInternal
    end
Loading

File-Level Changes

Change Details Files
Align Bluetooth audio device icon mapping for audio-headphones with other audio device types so UI shows a consistent headset icon.
  • Update deviceType2Icon mapping to map audio-headphones to the unified bluetooth_pheadset icon used by other audio audio-card/audio-headset types
src/plugin-bluetooth/operation/bluetoothdevice.h
Fix BluetoothWorker::connectDevice audio device type check to use mapped Bluetooth device types, re-enabling the duplicate connection prevention for audio devices.
  • Change audio device type comparison from raw audio-headset/audio-headphones values to mapped bluetooth_pheadset/bluetooth_headset values that deviceType() actually returns
  • Update SPDX copyright year range in bluetoothworker.cpp header comment from 2018-2023 to 2018-2026
src/plugin-bluetooth/operation/bluetoothworker.cpp

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey - I've found 1 issue, and left some high level feedback:

  • Consider adding a brief comment near deviceType() usage in BluetoothWorker::connectDevice to clarify that it returns the mapped icon/device type (e.g., bluetooth_pheadset) rather than the original audio-* type, to prevent future confusion or regressions.
  • The string literals for device types/icons (e.g., bluetooth_pheadset, bluetooth_headset) are repeated in multiple places; centralizing them as named constants or an enum-like structure would reduce the risk of mismatches in future changes.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- Consider adding a brief comment near `deviceType()` usage in `BluetoothWorker::connectDevice` to clarify that it returns the mapped icon/device type (e.g., `bluetooth_pheadset`) rather than the original `audio-*` type, to prevent future confusion or regressions.
- The string literals for device types/icons (e.g., `bluetooth_pheadset`, `bluetooth_headset`) are repeated in multiple places; centralizing them as named constants or an enum-like structure would reduce the risk of mismatches in future changes.

## Individual Comments

### Comment 1
<location path="src/plugin-bluetooth/operation/bluetoothdevice.h" line_range="26" />
<code_context>
         {"audio-card","bluetooth_pheadset"},
         {"audio-headset","bluetooth_pheadset"},
-        {"audio-headphones","bluetooth_headset"},
+        {"audio-headphones","bluetooth_pheadset"},
         {"network-wireless","bluetooth_lan"},
         {"camera-video","bluetooth_vidicon"},
</code_context>
<issue_to_address>
**suggestion:** Consider centralizing type-to-icon mapping and avoiding string duplication.

This mapping couples logical device types (e.g. `"audio-headphones"`) to icon IDs (e.g. `"bluetooth_pheadset"`), while other parts of the code branch on hard-coded type strings. Repeating these literals for both behavior and icons increases the risk of mismatches (as seen in `connectDevice`). Consider centralizing device-type definitions (e.g. constants or an enum) and keeping icon IDs separate, so behavioral logic never relies on icon names.

Suggested implementation:

```c
        {BluetoothDevice::Type::InputTablet,      BluetoothDevice::Icon::Touchpad},
        {BluetoothDevice::Type::AudioCard,        BluetoothDevice::Icon::PersonalHeadset},
        {BluetoothDevice::Type::AudioHeadset,     BluetoothDevice::Icon::PersonalHeadset},
        {BluetoothDevice::Type::AudioHeadphones,  BluetoothDevice::Icon::PersonalHeadset},
        {BluetoothDevice::Type::NetworkWireless,  BluetoothDevice::Icon::Lan},
        {BluetoothDevice::Type::CameraVideo,      BluetoothDevice::Icon::Vidicon},
        {BluetoothDevice::Type::Printer,          BluetoothDevice::Icon::Print},

```

To make this compile and fully implement the centralization:

1. **Introduce device type identifiers** in `bluetoothdevice.h`:
   - Add an enum (or enum class) for logical device types:
     ```cpp
     struct BluetoothDevice {
         enum class Type {
             InputTablet,
             AudioCard,
             AudioHeadset,
             AudioHeadphones,
             NetworkWireless,
             CameraVideo,
             Printer,
             // ...existing types
         };

         enum class Icon {
             Touchpad,
             PersonalHeadset,
             Lan,
             Vidicon,
             Print,
             // ...existing icons
         };

         // Optionally: helper conversion functions to/from QString/QByteArray
         static Type   typeFromString(const QString &typeId);
         static Icon   iconFromString(const QString &iconId);
         static const char *toString(Type type);
         static const char *toString(Icon icon);
     };
     ```
   - Ensure this `BluetoothDevice` type (or equivalent) is declared in a header that can be used both by behavioral logic (e.g. `connectDevice`) and icon mapping.

2. **Adapt the mapping container type**:
   - The initializer you edited likely belongs to an array or map of string pairs. After switching to `BluetoothDevice::Type` and `BluetoothDevice::Icon`, update the declaration accordingly, e.g.:
     ```cpp
     struct DeviceTypeIconMapping {
         BluetoothDevice::Type type;
         BluetoothDevice::Icon icon;
     };

     static const DeviceTypeIconMapping kDeviceTypeIconMap[] = {
         {BluetoothDevice::Type::InputTablet,      BluetoothDevice::Icon::Touchpad},
         {BluetoothDevice::Type::AudioCard,        BluetoothDevice::Icon::PersonalHeadset},
         {BluetoothDevice::Type::AudioHeadset,     BluetoothDevice::Icon::PersonalHeadset},
         {BluetoothDevice::Type::AudioHeadphones,  BluetoothDevice::Icon::PersonalHeadset},
         {BluetoothDevice::Type::NetworkWireless,  BluetoothDevice::Icon::Lan},
         {BluetoothDevice::Type::CameraVideo,      BluetoothDevice::Icon::Vidicon},
         {BluetoothDevice::Type::Printer,          BluetoothDevice::Icon::Print},
         // ...
     };
     ```
   - If the existing mapping is a `QHash<QString, QString>` or similar, either:
     * change it to use `Type`/`Icon` directly, or
     * keep that structure but build it from the strongly-typed map (converting via the helper functions in `BluetoothDevice`).

3. **Update behavioral logic to use `BluetoothDevice::Type` instead of raw strings**:
   - Anywhere in the codebase where you currently branch on raw type strings, e.g.:
     ```cpp
     if (deviceType == "audio-headphones") { ... }
     ```
     replace that with:
     ```cpp
     if (deviceType == BluetoothDevice::Type::AudioHeadphones) { ... }
     ```
   - Ensure that conversion from the underlying DBus / BlueZ / configuration strings to `BluetoothDevice::Type` happens in one place (e.g. a factory or parser), so the rest of the code deals only in the enum.

4. **Keep icon IDs decoupled from logic**:
   - Where you actually need the icon string (e.g. for UI), use a function that maps `BluetoothDevice::Type` to an icon:
     ```cpp
     QString BluetoothDevice::iconNameFor(BluetoothDevice::Type type) {
         // use kDeviceTypeIconMap to look up the Icon enum and then toString(Icon)
     }
     ```
   - Ensure no behavioral logic branches on icon ID strings; only the UI/rendering layer should consume those strings.

These additional steps will fully centralize the type-to-icon mapping and prevent behavioral logic from relying on duplicated string literals or icon IDs.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

{"audio-card","bluetooth_pheadset"},
{"audio-headset","bluetooth_pheadset"},
{"audio-headphones","bluetooth_headset"},
{"audio-headphones","bluetooth_pheadset"},

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

suggestion: Consider centralizing type-to-icon mapping and avoiding string duplication.

This mapping couples logical device types (e.g. "audio-headphones") to icon IDs (e.g. "bluetooth_pheadset"), while other parts of the code branch on hard-coded type strings. Repeating these literals for both behavior and icons increases the risk of mismatches (as seen in connectDevice). Consider centralizing device-type definitions (e.g. constants or an enum) and keeping icon IDs separate, so behavioral logic never relies on icon names.

Suggested implementation:

        {BluetoothDevice::Type::InputTablet,      BluetoothDevice::Icon::Touchpad},
        {BluetoothDevice::Type::AudioCard,        BluetoothDevice::Icon::PersonalHeadset},
        {BluetoothDevice::Type::AudioHeadset,     BluetoothDevice::Icon::PersonalHeadset},
        {BluetoothDevice::Type::AudioHeadphones,  BluetoothDevice::Icon::PersonalHeadset},
        {BluetoothDevice::Type::NetworkWireless,  BluetoothDevice::Icon::Lan},
        {BluetoothDevice::Type::CameraVideo,      BluetoothDevice::Icon::Vidicon},
        {BluetoothDevice::Type::Printer,          BluetoothDevice::Icon::Print},

To make this compile and fully implement the centralization:

  1. Introduce device type identifiers in bluetoothdevice.h:

    • Add an enum (or enum class) for logical device types:
      struct BluetoothDevice {
          enum class Type {
              InputTablet,
              AudioCard,
              AudioHeadset,
              AudioHeadphones,
              NetworkWireless,
              CameraVideo,
              Printer,
              // ...existing types
          };
      
          enum class Icon {
              Touchpad,
              PersonalHeadset,
              Lan,
              Vidicon,
              Print,
              // ...existing icons
          };
      
          // Optionally: helper conversion functions to/from QString/QByteArray
          static Type   typeFromString(const QString &typeId);
          static Icon   iconFromString(const QString &iconId);
          static const char *toString(Type type);
          static const char *toString(Icon icon);
      };
    • Ensure this BluetoothDevice type (or equivalent) is declared in a header that can be used both by behavioral logic (e.g. connectDevice) and icon mapping.
  2. Adapt the mapping container type:

    • The initializer you edited likely belongs to an array or map of string pairs. After switching to BluetoothDevice::Type and BluetoothDevice::Icon, update the declaration accordingly, e.g.:
      struct DeviceTypeIconMapping {
          BluetoothDevice::Type type;
          BluetoothDevice::Icon icon;
      };
      
      static const DeviceTypeIconMapping kDeviceTypeIconMap[] = {
          {BluetoothDevice::Type::InputTablet,      BluetoothDevice::Icon::Touchpad},
          {BluetoothDevice::Type::AudioCard,        BluetoothDevice::Icon::PersonalHeadset},
          {BluetoothDevice::Type::AudioHeadset,     BluetoothDevice::Icon::PersonalHeadset},
          {BluetoothDevice::Type::AudioHeadphones,  BluetoothDevice::Icon::PersonalHeadset},
          {BluetoothDevice::Type::NetworkWireless,  BluetoothDevice::Icon::Lan},
          {BluetoothDevice::Type::CameraVideo,      BluetoothDevice::Icon::Vidicon},
          {BluetoothDevice::Type::Printer,          BluetoothDevice::Icon::Print},
          // ...
      };
    • If the existing mapping is a QHash<QString, QString> or similar, either:
      • change it to use Type/Icon directly, or
      • keep that structure but build it from the strongly-typed map (converting via the helper functions in BluetoothDevice).
  3. Update behavioral logic to use BluetoothDevice::Type instead of raw strings:

    • Anywhere in the codebase where you currently branch on raw type strings, e.g.:
      if (deviceType == "audio-headphones") { ... }
      replace that with:
      if (deviceType == BluetoothDevice::Type::AudioHeadphones) { ... }
    • Ensure that conversion from the underlying DBus / BlueZ / configuration strings to BluetoothDevice::Type happens in one place (e.g. a factory or parser), so the rest of the code deals only in the enum.
  4. Keep icon IDs decoupled from logic:

    • Where you actually need the icon string (e.g. for UI), use a function that maps BluetoothDevice::Type to an icon:
      QString BluetoothDevice::iconNameFor(BluetoothDevice::Type type) {
          // use kDeviceTypeIconMap to look up the Icon enum and then toString(Icon)
      }
    • Ensure no behavioral logic branches on icon ID strings; only the UI/rendering layer should consume those strings.

These additional steps will fully centralize the type-to-icon mapping and prevent behavioral logic from relying on duplicated string literals or icon IDs.

@caixr23
caixr23 marked this pull request as draft August 11, 2026 08:53
@caixr23
caixr23 force-pushed the fix/bug-275675-bluetooth-audio-icon branch 2 times, most recently from f247000 to 8aa9ce2 Compare August 11, 2026 10:49
@deepin-bot

deepin-bot Bot commented Aug 11, 2026

Copy link
Copy Markdown

TAG Bot

New tag: 6.1.104
DISTRIBUTION: unstable
Suggest: synchronizing this PR through rebase #3409

@caixr23
caixr23 marked this pull request as ready for review August 12, 2026 08:43
@caixr23
caixr23 force-pushed the fix/bug-275675-bluetooth-audio-icon branch from 8aa9ce2 to 1f33faf Compare August 12, 2026 08:44

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey - I've left some high level feedback:

  • The hard-coded device type strings in connectDevice and deviceType2Icon make the logic brittle; consider centralizing these values as named constants or an enum so future changes to type names or mappings remain consistent.
  • Since deviceType() returns mapped values, it would help to clearly document this behavior where deviceType() is defined or used so future readers don’t mistakenly compare against raw device types again.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The hard-coded device type strings in `connectDevice` and `deviceType2Icon` make the logic brittle; consider centralizing these values as named constants or an enum so future changes to type names or mappings remain consistent.
- Since `deviceType()` returns mapped values, it would help to clearly document this behavior where `deviceType()` is defined or used so future readers don’t mistakenly compare against raw device types again.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

const BluetoothDevice *device = adapter->deviceById(deviceId);
if (device
&& (device->deviceType() == "audio-headset" || device->deviceType() == "audio-headphones")
&& (device->deviceType() == "bluetooth_pheadset" || device->deviceType() == "bluetooth_headset")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

device type 不是"audio-headphones"这种么,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

void BluetoothDevice::setDeviceType(const QString &deviceType)
{
m_deviceType = deviceType2Icon.contains(deviceType) ? deviceType2Icon[deviceType] : "bluetooth_other";
}
原代码在设置时就做了转换,所以再获取时是"bluetooth_pheadset"这种

…kbar

1. Map audio-headphones icon to bluetooth_pheadset in deviceType2Icon,
   unifying audio-card/audio-headset/audio-headphones rendering
2. Fix BluetoothWorker::connectDevice audio device type comparison:
   deviceType() returns the icon name mapped by setDeviceType(), not the
   raw BlueZ type, so compare against bluetooth_pheadset instead of the
   raw audio-headset/audio-headphones which never matched
3. Update SPDX copyright year to 2026

PMS: BUG-275675

fix: 统一控制中心与任务栏的蓝牙音频设备图标

1. 将 deviceType2Icon 中 audio-headphones 的图标映射从 bluetooth_headset
   改为 bluetooth_pheadset,与 audio-card/audio-headset 统一
2. 修复 BluetoothWorker::connectDevice 中音频设备类型判断:deviceType()
   返回的是经 setDeviceType 转换后的图标名而非原始 BlueZ 类型,因此应比较
   bluetooth_pheadset,原比较 audio-headset/audio-headphones 永不命中
3. 更新 SPDX 版权年份至 2026

PMS: BUG-275675
Change-Id: Ic64995399a61dce9e3a6ac7d5d445ea90fdf8eb0
@caixr23
caixr23 force-pushed the fix/bug-275675-bluetooth-audio-icon branch from 1f33faf to 4d8dff7 Compare August 12, 2026 09:16
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

★ 总体评分:100分

■ 【总体评价】

代码精准修复了蓝牙音频设备连接时的类型匹配错误,逻辑严密且注释详尽
修复彻底消除了原有逻辑缺陷,代码质量与可维护性极高,无任何扣分项

■ 【详细分析】

  • 1.语法逻辑(完全正确)✓

修复前在 bluetoothworker.cpp 的 connectDevice 函数中,直接使用 BlueZ 原始类型字符串与 deviceType() 的返回值进行比较,由于 deviceType() 实际返回的是经过 deviceType2Icon 映射后的图标名称,导致条件判断永远为假,无法正确跳过重复连接。修复后统一比较映射后的图标名 bluetooth_pheadset,并同步修正了 bluetoothdevice.h 中 audio-headphones 的映射值,彻底解决了类型不匹配问题。
建议:保持当前逻辑,无需额外修改

  • 2.代码质量(优秀)✓

增加了三行高质量的英文注释,清晰阐明了 deviceType() 返回值的真实来源、三种音频设备类型的统一映射关系以及修改此判断的根因,极大提升了后续维护人员的理解效率。同时将 audio-headphones 的图标映射从 bluetooth_headset 修正为 bluetooth_pheadset,保证了映射表内部的一致性。
建议:保持当前注释风格,后续类似底层接口映射逻辑均可参考此注释规范

  • 3.代码性能(高效)✓

将原有的两次字符串相等比较通过逻辑或连接优化为单次字符串相等比较,虽然在现代处理器上性能差异微乎其微,但属于合理的精简优化,未引入任何额外开销或系统调用。
建议:保持当前实现

  • 4.代码安全(存在0个安全漏洞)✓

漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个
本次修改仅涉及局部静态映射表的字符串替换和条件分支判断,不涉及内存操作、外部输入解析或权限变更,无任何安全风险。
建议:继续保持安全的编码习惯

■ 【改进建议代码示例】

// 当前代码已为最佳实践,无需额外改进,此处展示当前最终形态以供校验
// src/plugin-bluetooth/operation/bluetoothdevice.h
static const QMap<QString,QString> deviceType2Icon {
        // ...(其他映射省略)
        {"audio-card","bluetooth_pheadset"},
        {"audio-headset","bluetooth_pheadset"},
        {"audio-headphones","bluetooth_pheadset"},
        // ...
};

// src/plugin-bluetooth/operation/bluetoothworker.cpp
void BluetoothWorker::connectDevice(const QString &deviceId, const QString adapt)
{
    // ...(前文省略)
    const BluetoothDevice *device = adapter->deviceById(deviceId);
    // deviceType() returns the icon name mapped by setDeviceType() (bluetoothdevice.cpp:87),
    // not the raw BlueZ type. audio-card/audio-headset/audio-headphones all map to
    // bluetooth_pheadset, so compare against that to skip duplicate audio-device connects.
    if (device
        && device->deviceType() == "bluetooth_pheadset"
        && device->state() == BluetoothDevice::StateAvailable) {
        return;
    }
    // ...(后文省略)
}

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: 18202781743, caixr23

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants