Kakueeen / Deepin PR Quick Merge

// ==UserScript==
// @name         Deepin PR Quick Merge
// @namespace    https://github.com/linuxdeepin
// @version      1.0.0
// @description  在 linuxdeepin 组织的 GitHub PR 页面评论区添加 ⚡ Merge 按钮,一键输入 /forcemerge 并提交评论,快速触发 forcemerge 流程
// @author       linuxdeepin
// @match        https://github.com/linuxdeepin/*/pull/*
// @icon         https://github.com/linuxdeepin.png
// @license      MIT
// @run-at       document-idle
// @grant        none
// ==/UserScript==

(function () {
  'use strict';

  /**
   * 在 PR 评论框的按钮区域添加 "Quick Merge" 按钮。
   * 逻辑:点击后在评论框中填入 /forcemerge,然后自动提交 Comment。
   */

  function createMergeButton() {
    // 找到新评论表单
    const form = document.getElementById('new_comment_form');
    if (!form) return null;

    // 防止重复添加
    if (form.querySelector('.deepin-quick-merge-btn')) {
      return form.querySelector('.deepin-quick-merge-btn');
    }

    // 找到按钮容器(Comment 按钮所在的 d-flex.flex-justify-end)
    const btnRow = form.querySelector('.d-flex.flex-justify-end');
    if (!btnRow) return null;

    // 找到 Comment 按钮的包裹 div(.color-bg-subtle.ml-1)
    const commentWrapper = btnRow.querySelector('.color-bg-subtle.ml-1');
    if (!commentWrapper) return null;

    // 创建 Merge 按钮包裹 div
    const mergeWrapper = document.createElement('div');
    mergeWrapper.className = 'color-bg-subtle ml-1';

    // 创建按钮
    const mergeBtn = document.createElement('button');
    mergeBtn.type = 'button';
    mergeBtn.className = 'deepin-quick-merge-btn btn';
    mergeBtn.textContent = '⚡ Merge';
    mergeBtn.style.cssText = `
      background-color: #238636;
      color: #ffffff;
      border: 1px solid rgba(240,246,252,0.1);
      border-radius: 6px;
      padding: 5px 16px;
      font-size: 14px;
      font-weight: 600;
      cursor: pointer;
      white-space: nowrap;
    `;

    // 鼠标悬停效果
    mergeBtn.addEventListener('mouseenter', () => {
      mergeBtn.style.backgroundColor = '#2ea043';
    });
    mergeBtn.addEventListener('mouseleave', () => {
      mergeBtn.style.backgroundColor = '#238636';
    });

    // 点击事件:填入 /forcemerge 并提交
    mergeBtn.addEventListener('click', () => {
      // 找到评论输入框
      const textarea = document.getElementById('new_comment_field');
      if (!textarea) return;

      // 设置值并触发 GitHub 的事件监听
      textarea.value = '/forcemerge';
      textarea.dispatchEvent(new Event('input', { bubbles: true }));
      textarea.dispatchEvent(new Event('change', { bubbles: true }));

      // 找到 Comment 提交按钮并点击
      const commentBtn = form.querySelector('button.btn-primary[type="submit"]');
      if (commentBtn) {
        // 如果按钮是 disabled 的,需要先启用它
        commentBtn.disabled = false;
        commentBtn.click();
      }
    });

    mergeWrapper.appendChild(mergeBtn);

    // 插入到 Comment 按钮的右边
    commentWrapper.parentNode.insertBefore(mergeWrapper, commentWrapper.nextSibling);

    return mergeBtn;
  }

  // 初次尝试
  createMergeButton();

  // GitHub 是 SPA,页面切换时需要重新注入
  // 使用 MutationObserver 监听 DOM 变化
  const observer = new MutationObserver(() => {
    const form = document.getElementById('new_comment_form');
    if (form && !form.querySelector('.deepin-quick-merge-btn')) {
      setTimeout(createMergeButton, 500);
    }
  });

  observer.observe(document.body, { childList: true, subtree: true });
})();