Update Fork

原因

希望可以自动合并所有 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);
})();