one-click-github-SSH-clone

Userscript that adds a button to the left of Github's green clone button which copies the SSH clone URL to your clipboard when you click it. Without showing a menu first.

As of 2019-12-19. See the latest version.

// ==UserScript==
// @name         one-click-github-SSH-clone 
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Userscript that adds a button to the left of Github's green clone button which copies the SSH clone URL to your clipboard when you click it. Without showing a menu first. 
// @author       You
// @match        https://github.com/*
// @grant        none
// ==/UserScript==

function getSshUrl() {
	return document.querySelector("#js-repo-pjax-container > div.container-lg.clearfix.new-discussion-timeline.experiment-repo-nav.px-3 > div > div.file-navigation.in-mid-page.d-flex.flex-items-start > details.get-repo-select-menu.js-get-repo-select-menu.position-relative.details-overlay.details-reset > div > div > div.get-repo-modal-options > div.clone-options.ssh-clone-options > div > div > clipboard-copy").value
}


function copyToClipboard(text) {
    var dummy = document.createElement("textarea");
    // to avoid breaking orgain page when copying more words
    // cant copy when adding below this code
    // dummy.style.display = 'none'
    document.body.appendChild(dummy);
    //Be careful if you use texarea. setAttribute('value', value), which works with "input" does not work with "textarea". – Eduard
    dummy.value = text;
    dummy.select();
    document.execCommand("copy");
    document.body.removeChild(dummy);
}


function actions(){
	//container = document.querySelector("#js-repo-pjax-container > div.container-lg.clearfix.new-discussion-timeline.experiment-repo-nav.px-3 > div > div.file-navigation.in-mid-page.d-flex.flex-items-start > div.BtnGroup")
	const parentString = "#js-repo-pjax-container > div.container-lg.clearfix.new-discussion-timeline.experiment-repo-nav.px-3 > div > div.file-navigation.in-mid-page.d-flex.flex-items-start"

	const parentEl = document.querySelector(parentString)
	const cloneEl = document.querySelector(
		parentString + "> details.get-repo-select-menu")

	const newButton = document.createElement("summary")
	newButton.classList.add("btn")
	newButton.classList.add("btn-sm")
	newButton.classList.add("btn-primary")
	newButton.classList.add("ml-2")
	newButton.style = "height: 28px; width: 81px; background: url('data:image/png;base64,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CiAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOmlwdGNFeHQ9Imh0dHA6Ly9pcHRjLm9yZy9zdGQvSXB0YzR4bXBFeHQvMjAwOC0wMi0yOS8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICB4bWxuczpwbHVzPSJodHRwOi8vbnMudXNlcGx1cy5vcmcvbGRmL3htcC8xLjAvIgogICAgeG1sbnM6R0lNUD0iaHR0cDovL3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iCiAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgeG1wTU06RG9jdW1lbnRJRD0iZ2ltcDpkb2NpZDpnaW1wOjUyMjMyNWRhLTlkZjktNGI3My1hOTc3LWVlNmI4ZTJjYzc2OCIKICAgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiYWViMmRmZC1jMTViLTQwMDAtYTNmMi01YTlhNmUyYWI0NTIiCiAgIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpmYzIzMWE2OS03MzcwLTQxZmYtYWYxMC03MGNlMTY0NmI4MGEiCiAgIEdJTVA6QVBJPSIyLjAiCiAgIEdJTVA6UGxhdGZvcm09IkxpbnV4IgogICBHSU1QOlRpbWVTdGFtcD0iMTU3NjM2ODcxNjA2ODEwMSIKICAgR0lNUDpWZXJzaW9uPSIyLjEwLjgiCiAgIGRjOkZvcm1hdD0iaW1hZ2UvcG5nIgogICBleGlmOlBpeGVsWERpbWVuc2lvbj0iMjE1IgogICBleGlmOlBpeGVsWURpbWVuc2lvbj0iNjciCiAgIHRpZmY6SW1hZ2VIZWlnaHQ9IjY3IgogICB0aWZmOkltYWdlV2lkdGg9IjIxNSIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIuMTAiPgogICA8aXB0Y0V4dDpMb2NhdGlvbkNyZWF0ZWQ+CiAgICA8cmRmOkJhZy8+CiAgIDwvaXB0Y0V4dDpMb2NhdGlvbkNyZWF0ZWQ+CiAgIDxpcHRjRXh0OkxvY2F0aW9uU2hvd24+CiAgICA8cmRmOkJhZy8+CiAgIDwvaXB0Y0V4dDpMb2NhdGlvblNob3duPgogICA8aXB0Y0V4dDpBcnR3b3JrT3JPYmplY3Q+CiAgICA8cmRmOkJhZy8+CiAgIDwvaXB0Y0V4dDpBcnR3b3JrT3JPYmplY3Q+CiAgIDxpcHRjRXh0OlJlZ2lzdHJ5SWQ+CiAgICA8cmRmOkJhZy8+CiAgIDwvaXB0Y0V4dDpSZWdpc3RyeUlkPgogICA8eG1wTU06SGlzdG9yeT4KICAgIDxyZGY6U2VxPgogICAgIDxyZGY6bGkKICAgICAgc3RFdnQ6YWN0aW9uPSJzYXZlZCIKICAgICAgc3RFdnQ6Y2hhbmdlZD0iLyIKICAgICAgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyZjE3NjA1NC0wNTA1LTQ1MmItOTVlNy1iNGMwNzgwMDk3ZjMiCiAgICAgIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkdpbXAgMi4xMCAoTGludXgpIgogICAgICBzdEV2dDp3aGVuPSItMDU6MDAiLz4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiCiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6Yjk0ODYzNGItOGM4Ni00NjQ1LWJlZjAtODRjMmYxM2U1YWZiIgogICAgICBzdEV2dDpzb2Z0d2FyZUFnZW50PSJHaW1wIDIuMTAgKExpbnV4KSIKICAgICAgc3RFdnQ6d2hlbj0iLTA1OjAwIi8+CiAgICA8L3JkZjpTZXE+CiAgIDwveG1wTU06SGlzdG9yeT4KICAgPHBsdXM6SW1hZ2VTdXBwbGllcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVzOkltYWdlU3VwcGxpZXI+CiAgIDxwbHVzOkltYWdlQ3JlYXRvcj4KICAgIDxyZGY6U2VxLz4KICAgPC9wbHVzOkltYWdlQ3JlYXRvcj4KICAgPHBsdXM6Q29weXJpZ2h0T3duZXI+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpDb3B5cmlnaHRPd25lcj4KICAgPHBsdXM6TGljZW5zb3I+CiAgICA8cmRmOlNlcS8+CiAgIDwvcGx1czpMaWNlbnNvcj4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PsuBfY4AAAAGYktHRAD/AAAAADMnfPMAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfjDA8ACzgKYV+OAAAD1ElEQVRIx22WPY4sRRCEv6iqmXHQc7CQcDkEF3w2h+BSHADjSUgY7LLLdFcGRv32wK7mvzsrIzIyMvUl//iT0HdKIqVMSYVSCvfbvT0eDx6PB7f7nfujcL/feDzu5JIBEREcz5Pn8Q/P48nb+xsfH3/z/v7O58cnx3EQEdgGwBgwQkgCu38HSO0aQ3sHkkgpgcDRf2yXVsQfwLeC+Qr8bFsOU6moilNHO0Tt4BqVGoWzntRaKbfSghvqeRJRW6IeKbUkJSEEmGgoZrLj4+uftH6wTUS0XBCoRZP0Jvwr8Eux/T3wAyFVtUTaI4gIaq2ctXIcB+XIlGfh81a45UIuhSR1JoN6ViJM1AC7HYbohKMOUB2kRwF6chPUeJqErKoIkVrMv0BfwKlgZBnbkkWkwNEDhIkwNYJaT46ayGemPBO5NBC3vCpy1pN6VlxNV80kXROscWcTazKvnHAYR8wKiI5YEDYiSCSQrA118VZTC5LbXWFjV8JdSjWTa6bUjG+lfV+DKJWkjN0qcTwP6nES1ZPpWYqhdHvTTL8uPPumoYeXj6OcGNOxAlBGqw3lDu3ZsclK1KjkyNSaqTXIJZNS4siZ1Bqnye9s1YghrfBQxpRYA7WSsEcF/J9G0QAukPu1xLCGAYKLFiM6O7QDG4Fueo4gahC1ks6EUiYpda2uZGqt1O5IvrhNl1Q/TGp9YdhovzrTAtKD2D2ehhqbnEbCLVZMK/QI1Jm0TNiEhSKR1FwjDWl0U4gw4WjsIUjG9QVIB/1CO+rutQPRlJVWzOUFTU5Xu1vP2qJ7NptxtMBWK2ptvKw73RrRikbGLIXmjLCv5qrNltc33tJbFadb/7ir+H8CrbRHlT1tYjgMBGGBtenWXbijMF7ymY2sza1iS7KZ55RRNwLL2+labFuT5bIV7jKgxrx4ZcuTxR78AtLzvZJIzjiiA9lqq9Fzqb16tKleJt4GyMxa79VSk1NCL5agWYeV4GiuodnJ9hzCq3JJtJGkJtwltPW/BslKRi9ilgRprRve1hUlLTlt6V30/LoQaJeTmSsJL17edJsQqdOTlu8rCEezyN1NtRPSqjbVtznvXGOSkNI8uPQTnKS2+ux3zRokpDwdSKOptFa6BiBNWaQhjqwLFUkQ7nR4ZDlM4jrgdpKE0OoDe26Uphj+FHzDrdVa+FjzfqS0LW5isNGHYrgzlNpaMLxSm3497ELXBmVfBkcFOhUvZ86rW/rv4DcgCvg3Q4FIGqW/mOuVydlTfXNQSm0msOQ015oBhM28OhDPJtAcfGMIWgvgiOkB2IMcPrF+B+q/66vIHMRqrIkAAAAASUVORK5CYII=') no-repeat center center fixed; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover;"
	newButton.innerHTML = "Quickclone"
	newButton.onclick = function() {
		copyToClipboard(getSshUrl())
		console.log("copied SSH clone url to clipboard")
		newButton.innerHTML = "  Copied  "
		setTimeout(function(){
			newButton.innerHTML = "Quickclone"
		}, 396)
	}

	parentEl.insertBefore(newButton, cloneEl)
}


(function() {
    'use strict';
    console.log(`tampermonkey got ssh clone url ${getSshUrl()}`);
    actions();
})();