原因
希望可以自动合并所有 Fork 项目的上游提交
实现
// ==UserScript==
// @name Github AutoMergeFork
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author clh021@gmail.com
// @match https://github.com/clh021?
// @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
// @grant none
// ==/UserScript==
(function () {
"use strict";
const targetName = "auto_merge_fork_win_";
function openAllForkProj() {
let forkProjs = document.querySelectorAll(".rgh-discussion-links");
forkProjs.forEach((e, i) => {
console.log(i, e.href);
window.open(e.href, `${targetName}${i}`);
}); // 需要在chrome中允许多次弹出窗口
}
function addUpdateForkBtn() {
let forkDiv = document.createElement("div");
forkDiv.append("UpdateFork");
forkDiv.id = "fork-all-proj-area";
forkDiv.style =
"border: 1px solid darkgreen;color: darkgreen;cursor: pointer;padding: 5px;position: fixed;right: 10px;top: 65px;z-index: 10000;";
document.body.append(forkDiv);
document
.querySelector("#fork-all-proj-area")
.addEventListener("click", openAllForkProj);
}
function hasMerge() {
let fetchMessage = document.querySelectorAll(
".Layout-main > .Box > .flex-auto"
)[0].innerText;
return fetchMessage.indexOf("behind") > 0;
}
function doMerge() {
// document.querySelectorAll('.js-fetch-upstream-summary')[0].click();
console.log("doMerge...");
setTimeout(() => {
let btn = document.querySelectorAll(
".js-fetch-upstream-no-conflicts-ui > .Box-row > div > form > button"
)[0];
if (btn) {
btn.click(); // 合并完毕后,页面刷新会再触发没有合并内容的检查而 自动关闭 。
} else {
doMerge();
}
}, 2000);
}
function autoClose() {
if (name.startsWith(targetName)) {
// 是自动打开的页面,应该考虑在没有合并内容的情况下,自动关闭。
window.close();
}
}
function inForkPageList() {
let url = document.URL;
if (url.startsWith("https://github.com/") && url.indexOf("type=fork") > 0) {
return true;
}
return false;
}
function main() {
if (inForkPageList()) {
addUpdateForkBtn();
} else if (document.URL.startsWith("https://github.com/")) {
if (hasMerge()) {
console.log("有可以合并的内容,要合并吗?");
setTimeout(() => {
document.querySelectorAll(".js-fetch-upstream-summary")[0].click();
doMerge();
}, 2000);
} else {
autoClose();
}
}
}
window.addEventListener("load", main, false);
})();