NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==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 });
})();