Create a gist now

Instantly share code, notes, and snippets.

@johan / forked from johan/autofork.js
Last active Mar 10, 2017

What would you like to do?
(Re)fork any gist, including your own

Want to fork your own gists? No fork button? No problem! Install this user script by clicking refork.user.js' "raw" link down below: ⇓

// ==UserScript==
// @name (Re)fork any gist, including your own
// @namespace
// @version 2.0 - updated 2015-06-21
// @description Adds a "fork" button to gists missing one at, so you can create multiple forks
// @match*
// @include*
// ==/UserScript==
if (/^\/[^\/]+\/\d+/.test(location.pathname) &&
!document.querySelector('form[action$="/fork"]')) {
var actions = document.querySelector('.gisthead .pagehead-actions')
, auth = document.querySelector('input[name="authenticity_token"]').outerHTML
, fork = document.createElement('li')
, url = location.pathname + '/fork'
fork.innerHTML = '<form accept-charset="UTF-8" action="'+ url + '" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓">' + auth + '</div><button class="btn btn-sm" type="submit"><span class="octicon octicon-repo-forked"></span>Fork</button></form>';

Awesome user script. Works like a charm. :)

andrioli commented Oct 3, 2012

Really nice

jlewin commented Jan 9, 2013

Does this still work for anyone? I haven't been on the site in a while and I don't recall what it used to look like but it appears the content on the site changed and broke the script logic.

Never mind, found the announcement:

jlewin commented Jan 9, 2013

Interesting. I forked the script and updated it to account for the site changes but the userscript only runs when a full page refresh is invoked (confirmed with a quick console.log statement before any conditional logic). Some research into the problem reveals they are using pjax to improve perceived page load times and the ajax style page refreshes bypass the page load mechanism that normally would cause the userscript to be invoked.

Theoretically you could catch the pjax load/completed events and run the script logic but hooking the custom events without jQuery is too big a challenge to tackle tonight.

$(document).on('pjax:complete', function() {
// Call button inject logic here

jlewin commented Jan 10, 2013

It seems jQuery doesn't use dom events (except in some fallback scenarios) and thus I was unable to hook 'pjax:complete' or any other jQuery event for that matter. As a workaround, a MutationObserver was registered to monitor changes to the '#js-pjax-container' element and button injection is now rerun after dom modifications are detected. Probably not the cleanest or most elegant solution but given the constraints of the extension sandbox, it seemed reasonable. I'd love to see other takes on the problem but for now this approach seems to work.

Btw, very creative solution Johan... thanks!

URL has changed to location.pathname + '/fork'

i came across this from stack over flow when i searched on bing "github how to fork gist"

this is exactly what i needed. however has this been updated to included the location.pathname + '/fork' like eric-wieser says?

also what do you mean user script? i dont get how to use this. im having to convert it to a bookmarklet.

found updated version here:

This will never work again unless github blesses it. Do a view-source and search for authenticity_token. Game over, man. Game over.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment