Skip to content

Instantly share code, notes, and snippets.

@andrii-riabchun
Last active December 8, 2017 08:01
Show Gist options
  • Save andrii-riabchun/83dd638de7c934c6107e56f6689761d4 to your computer and use it in GitHub Desktop.
Save andrii-riabchun/83dd638de7c934c6107e56f6689761d4 to your computer and use it in GitHub Desktop.
UserScript: Github Repository Size
// ==UserScript==
// @name Github Repository Info
// @namespace artisresistance
// @description Show github repository size and creation date
// @include https://github.com/*
// @version 1.01
// ==/UserScript==
let regex = /^https:\/\/github.com\/([0-9A-Za-z\-_]*)\/([^\/]*)$/;
let match = document.URL.match(regex);
let list = document.querySelector(".pagehead-actions");
let sizeIcon = '<svg class="octicon" viewBox="0 0 16 16" height="16" xmlns="http://www.w3.org/2000/svg" width="16" style="margin-right:0.2em"><path transform="rotate(0,8,8) translate(2.43781232833862,2) scale(0.375,0.375) " d="M1.9 22.9L27.8 22.9C28.8 22.9 29.7 23.7 29.7 24.7L29.7 30.1C29.7 31.2 28.8 32 27.8 32L1.9 32C0.8 32 0 31.2 0 30.1L0 24.7C0 23.7 0.8 22.9 1.9 22.9zM1.9 11.3L27.8 11.3C28.8 11.3 29.7 12.2 29.7 13.2L29.7 18.6C29.7 19.6 28.8 20.5 27.8 20.5L1.9 20.5C0.8 20.5 0 19.6 0 18.6L0 13.2C0 12.2 0.8 11.3 1.9 11.3zM5.5 2.5C4.3 2.5 3.4 3.4 3.4 4.6 3.4 5.7 4.3 6.7 5.5 6.7 6.6 6.7 7.6 5.7 7.6 4.6 7.6 3.4 6.6 2.5 5.5 2.5zM1.9 0L27.8 0C28.8 0 29.7 0.8 29.7 1.9L29.7 7.3C29.7 8.3 28.8 9.1 27.8 9.1L1.9 9.1C0.8 9.1 0 8.3 0 7.3L0 1.9C0 0.8 0.8 0 1.9 0z"/></svg>';
let createdIcon ='<svg class="octicon" style="margin-right:0.2em" xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16"><path transform="rotate(0,8,8) translate(2,2.00018739700317) scale(0.375,0.375) " fill="#000000" d="M12.1 0L19.9 0 19.9 12.1 32 12.1 32 19.9 19.9 19.9 19.9 32 12.1 32 12.1 19.9 0 19.9 0 12.1 12.1 12.1z"/></svg>';
function formatSize(size) {
var alternate = size+"KB";
function merge(main) {
return {
main: main,
alt: alternate
}
}
var suffix = "";
var readable = 0;
if (size >= 0x100000) {
suffix = "GB";
readable = (size >> 10);
} else if (size >= 0x400) {
suffix = "MB";
readable = size;
} else {
return merge(size + "KB");
}
var main = (readable / 1024).toFixed(1) + suffix;
return merge(main);
}
function formatDate(timestamp) {
var date = new Date(timestamp);
var alternate = date.toLocaleString();
function merge(main) {
return {
main: main,
alt: alternate
}
}
var seconds = Math.floor((new Date() - date) / 1000);
var interval = Math.floor(seconds / 31536000);
if (interval > 1) {
return merge(interval+ " years ago");
}
interval = Math.floor(seconds / 2592000);
if (interval > 1) {
return merge(interval + " months ago");
}
interval = Math.floor(seconds / 86400);
if (interval > 1) {
return merge(interval + " days ago");
}
interval = Math.floor(seconds / 3600);
if (interval > 1) {
return merge(interval + " hours ago");
}
interval = Math.floor(seconds / 60);
if (interval > 1) {
return merge(interval + " minutes ago");
}
return merge(Math.floor(seconds) + " seconds ago");
}
function appendToList(size, created){
size = createNode("Size", sizeIcon, formatSize(size));
created_at = createNode("Created", createdIcon, formatDate(created));
list.appendChild(created_at);
list.appendChild(size);
}
function createNode(title, icon, value){
let node = document.createElement("li");
node.setAttribute("title", value.alt);
node.innerHTML = '<form class="btn btn-sm btn-with-count">' + icon + title +'</form>'+
'<div class="social-count">' + value.main + '</div>';
return node;
}
function check(response) {
if (!response.ok) {
if (response.headers.get("X-RateLimit-Remaining") == 0) {
return Promise.reject(new Error("Github API: rate exceeded."));
}
if (response.status==404) {
return Promise.reject(new Error("Github API: repository not found or private"));
}
return Promise.reject(new Error("Github API: "+response.statusText));
}
return Promise.resolve(response);
}
if (match !== null && list !== null) {
let user = match[1];
let repoName = match[2];
let url = "https://api.github.com/repos/"+user+"/"+repoName;
fetch(url)
.then(check)
.then(response => response.json())
.then(repo => appendToList(repo.size, repo.created_at))
.catch(err => console.log("user.js::"+err));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment