MySSHAlias

为 Github 添加自定义的 ssh 别名

// ==UserScript==
// @name        MySSHAlias
// @name:zh-CN        MySSHAlias
// @namespace   https://greasyfork.org/users/681572-q962
// @match       https://github.com/*
// @version     1.1
// @author      q962
// @license     MIT
// @description Add a custom ssh alias for Github
// @description:zh-CN  为 Github 添加自定义的 ssh 别名
// @grant        GM_setClipboard
// @grant        GM_addStyle
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

let meta_user_login = document.querySelector('[name="user-login"]') || {}
let current_user_repositorie = location.pathname.split('/').at(1)

if( meta_user_login.content != current_user_repositorie ) return

GM_addStyle(`
.alias_input_elem {
  margin-right: 1em;
}
`);

let primerPortalRoot;

function get_repository_path(){
  let parts = location.pathname.split('/')

  return parts[1] + '/' + parts[2]
}

const observer = new MutationObserver(function (mutationsList, observer) {
  if (!document.querySelector("#repository-container-header:not([hidden])"))
    return;

  for (const mutation of mutationsList) {
    for (const target of mutation.addedNodes) {
      if (target.nodeType != Node.ELEMENT_NODE) continue;

      if (
        target.parentElement &&
        target.parentElement.id == "__primerPortalRoot__"
      ) {
        primerPortalRoot = target.parentElement;

        let terminal_icon_elem = target.querySelector(".octicon-terminal");
        if (!terminal_icon_elem) continue;

        let clone_title_elem = terminal_icon_elem.nextElementSibling;
        if (!clone_title_elem) continue;

        let alias_input_box_elem = clone_title_elem.cloneNode();
        clone_title_elem.parentElement.insertBefore(
          alias_input_box_elem,
          clone_title_elem.nextElementSibling
        );

        let alias_input_elem = document.createElement("input");

        alias_input_elem.value = GM_getValue("alias") || "";
        alias_input_elem.className =
          "form-control input-monospace input-sm color-bg-subtle alias_input_elem";
        alias_input_elem.readOnly = false;
        alias_input_elem.placeholder = "ssh alias";
        alias_input_elem.addEventListener("keyup", (event) => {
          GM_setValue("alias", event.target.value);

          let alias = event.target.value || "github.com"

          let my_ssh_alias_url_elem = primerPortalRoot.querySelector(
            ".my_ssh_alias_url_elem"
          );
          if (my_ssh_alias_url_elem)
            my_ssh_alias_url_elem.value = `git@${alias}:${get_repository_path()}.git`;
        });

        alias_input_box_elem.appendChild(alias_input_elem);
      }

      if (!primerPortalRoot) continue;

      let my_ssh_alias_url_elem = primerPortalRoot.querySelector(
        ".my_ssh_alias_url_elem"
      );

      let clone_with_ssh_elem = target.querySelector("#clone-with-ssh");
      if (!my_ssh_alias_url_elem && clone_with_ssh_elem) {
        let url_input_container =
          clone_with_ssh_elem.parentElement.cloneNode(true);
        let input_elem = url_input_container.querySelector("#clone-with-ssh");
        input_elem.id = "";
        input_elem.setAttribute("value", "");

        let alias = GM_getValue("alias") || "github.com";
        input_elem.value = `git@${alias}:${get_repository_path()}.git`;

        input_elem.nextElementSibling.addEventListener("click", () => {
          GM_setClipboard(input_elem.value);
        });

        my_ssh_alias_url_elem = input_elem;
        my_ssh_alias_url_elem.classList.add("my_ssh_alias_url_elem");

        clone_with_ssh_elem.parentElement.parentElement.insertBefore(
          url_input_container,
          clone_with_ssh_elem.parentElement
        );
      }

      if (my_ssh_alias_url_elem) {
        if (primerPortalRoot.querySelector("#clone-with-ssh"))
          my_ssh_alias_url_elem.parentElement.removeAttribute("hidden");
        else my_ssh_alias_url_elem.parentElement.setAttribute("hidden", "");
      }
    }
  }
});
observer.observe(document, { childList: true, subtree: true });