uknowngithubuser
10/20/2018 - 11:12 PM

Download All Gists #Universal #Shell #Utillities

Download All Gists #Universal #Shell #Utillities

#!/usr/bin/env node

var fs = require("fs"),
    https = require("https"),
    exec = require("child_process").exec;

// TODO --pull or --push

var user = process.argv[2],
    token = process.argv[3];

fetchAndClone(1, function callback(error, nextPage) {
  if (error) throw error;
  if (nextPage > 0) fetchAndClone(nextPage, callback);
});

function fetchAndClone(page, callback) {
  fetch(page, function(error, gists) {
    if (error) return callback(error);
    if (gists.length) ++page; else page = -1;
    cloneNext(gists.pop());

    function cloneNext(gist) {
      if (!gist) return callback(null, page);
      if (directoryExists(gist.id)) return cloneNext(gists.pop());
      console.log("cloning " + gist.id);
      exec("git clone git@gist.github.com:" + gist.id + ".git", function(error, stdout, stderr) {
        if (error) return callback(error);
        cloneNext(gists.pop());
      });
    }
  });
}

function fetch(page, callback) {
  var request = https.request({
    hostname: "api.github.com",
    port: 443,
    path: "/users/" + encodeURIComponent(user) + "/gists?page=" + page,
    method: "GET",
    headers: {
      "Accept": "application/vnd.github.v3+json",
      "Authorization": "token " + token,
      "User-Agent": "mbostock/gist-clone-all"
    }
  }, function(response) {
    var chunks = [];
    response.setEncoding("utf8");
    response.on("data", function(chunk) { chunks.push(chunk); });
    response.on("end", function() { callback(null, JSON.parse(chunks.join(""))); });
  });
  request.on("error", callback);
  request.end();
}

function directoryExists(path) {
  try {
    return fs.lstatSync(path).isDirectory();
  } catch (ignored) {
    return false;
  }
}