-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxgithub
More file actions
executable file
·86 lines (77 loc) · 2.17 KB
/
xgithub
File metadata and controls
executable file
·86 lines (77 loc) · 2.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env node
var program = require('commander');
var jsdom = require("jsdom/lib/old-api");
var fs = require('fs');
var https = require('https');
var path = require('path');
var shell = require('shelljs');
shell.config.silent = true;
const DOMAIN = 'https://github.com';
const RAW_DOMAIN = 'https://raw.githubusercontent.com';
function createFile(href, filepath) {
let rawurl = RAW_DOMAIN+href.replace('/blob/', '/');
let filename = path.join(filepath, path.basename(href));
let file = fs.createWriteStream(filename);
console.log('[file] start:', filename);
var request = https.get(rawurl, function(res) {
res.pipe(file);
file.on('finish', function() {
console.log('[file] done:', filename);
file.close();
});
}).on('error', function(err) {
fs.unlink(filename);
console.error('[file] error:', err.message);
});
}
function parseDirectory(url, dir) {
jsdom.env({
url,
headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:23.0) Gecko/20100101 Firefox/23.0' },
done: function (error, window) {
if (error) {
console.log('[jsdom] error:', error);
return;
}
let $ = require("jquery")(window);
if (!dir) {
let isFile = $('.file table').length !==0;
if (isFile) {
createFile(url.replace(DOMAIN, ''), shell.pwd()+'');
return;
} else {
url = url.replace('/blob/', '/tree/');
dir = path.basename(url);
}
}
shell.mkdir('-p', dir);
shell.pushd(dir);
console.log('[dir] start:', dir);
let pwd = shell.pwd()+'';
$(".file-wrap .files .js-navigation-item .content").each(function() {
let el = $(this);
let isDirectory = el.prev().find('.octicon-file-directory').length !==0;
let href = el.find('a').attr('href');
let suburl = DOMAIN + href;
if (isDirectory) {
let subdir = suburl.replace(url+'/', '');
parseDirectory(suburl, path.join(pwd, subdir));
shell.popd();
console.log('[dir] done:', dir);
} else {
createFile(href, pwd);
}
});
}
});
}
program
.version('0.0.1')
.option('-u, --url [url]', 'the url for download', '')
.parse(process.argv);
let { url } = program;
if (!url) {
console.log('url must be set');
return;
}
parseDirectory(url);