Last active
January 15, 2016 12:49
-
-
Save psychoss/325e9e57ee5001ab461e to your computer and use it in GitHub Desktop.
GitHub Gists Backup
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env node | |
var rest = require('restler'); | |
var request = require('request'); | |
var fs = require('fs'); | |
var mkdirp = require('mkdirp'); | |
var prompt = require('sync-prompt').prompt; | |
var ghUsername = process.argv[2] || prompt('Your GitHub Username? '); | |
var ghPassword = process.argv[3] || prompt.hidden('Your GitHub Password? '); | |
var savedir = process.argv[4] || prompt('Path to back-up dir (will create if not exists)? ') || 'gists'; | |
mkdirp(savedir); | |
function getGists(page) { | |
'use strict'; | |
var options = { | |
username: ghUsername, | |
password: ghPassword, | |
headers: { | |
'User-Agent': 'Gists backup' | |
} | |
}; | |
rest.get('https://api.github.com/gists?per_page=100&page=' + page, options).on('complete', function (data, response) { | |
var increment = 1; | |
data.forEach(function (gist) { | |
var description = (!gist.description) ? 'Untitled' : gist.description | |
.trim() | |
.replace(/[^a-zA-Z0-9\s]/g, ''); | |
var dir = savedir + '/' + description; | |
try { | |
fs.statSync(dir); | |
dir = dir + ' duplicate ' + increment++; | |
mkdirp(dir, function (error) { | |
if (error) { | |
throw error; | |
} else { | |
console.log('successfully created ' + dir); | |
} | |
}); | |
} | |
catch (err) { | |
mkdirp(dir, function (error) { | |
if (error) { | |
console.log('Error: ' + error); | |
} else { | |
console.log('successfully created ' + dir); | |
} | |
}); | |
} | |
for (var file in gist.files) { | |
if (gist.files.hasOwnProperty(file)) { | |
var raw_url = gist.files[file].raw_url; | |
var filename = gist.files[file].filename; | |
var streamed = fs.createWriteStream(dir + '/' + filename); | |
request(raw_url).pipe(streamed); | |
streamed.on('error', function(error){ | |
console.log('Write error: ' + error); | |
}); | |
} | |
} | |
}); | |
if (page === 1 && response.headers.link) { | |
var links = response.headers.link.split(','); | |
for (var link in links) { | |
if (links.hasOwnProperty(link)) { | |
link = links[link]; | |
if (link.indexOf('rel="next') > -1) { | |
var pages = link.match(/[0-9]+/)[0]; | |
} | |
} | |
for (var p = 2; p < pages; p++) { | |
getGists(p); | |
} | |
} | |
} | |
}); | |
} | |
getGists(1); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment