1 |
|
2 | (function() {
|
3 | var autocode, error, fs, gunzip, mkdirp, request, semver, tarfs, untar, update, userHome, version, zlib;
|
4 |
|
5 | autocode = require('../autocode');
|
6 |
|
7 | error = require('../error');
|
8 |
|
9 | fs = require('fs');
|
10 |
|
11 | gunzip = require('gunzip-maybe');
|
12 |
|
13 | mkdirp = require('mkdirp');
|
14 |
|
15 | request = require('sync-request');
|
16 |
|
17 | semver = require('semver');
|
18 |
|
19 | tarfs = require('tar-fs');
|
20 |
|
21 | untar = require('untar.js');
|
22 |
|
23 | userHome = require('user-home');
|
24 |
|
25 | version = require('../version');
|
26 |
|
27 | zlib = require('zlib');
|
28 |
|
29 | update = function() {
|
30 | var config, j, len, loadModules, loaded_modules, modules, path, project, submodule, submodules;
|
31 | path = userHome + "/.autocode/module/";
|
32 | if (!fs.existsSync(path)) {
|
33 | mkdirp.sync(path);
|
34 | }
|
35 | if (this.config) {
|
36 | config = this.config;
|
37 | } else {
|
38 | config = this.load();
|
39 | }
|
40 | if (config.modules || config.imports) {
|
41 | modules = config.modules ? config.modules : config.imports;
|
42 | }
|
43 | if (!modules) {
|
44 | return;
|
45 | }
|
46 | loaded_modules = {};
|
47 | submodules = [];
|
48 | loadModules = function(modules) {
|
49 | var access_token_url, data, headers, j, len, module_config, module_name, module_path, module_path_name, module_version, module_version_query, release, releases, resp, response, results, tarball_url, url;
|
50 | results = [];
|
51 | for (module_name in modules) {
|
52 | module_version = null;
|
53 | module_version_query = modules[module_name];
|
54 | module_path_name = module_name.replace(/\./, '/');
|
55 | if (!loaded_modules[module_name]) {
|
56 | loaded_modules[module_name] = [];
|
57 | }
|
58 | if (loaded_modules[module_name].indexOf(module_version_query) !== -1) {
|
59 | continue;
|
60 | } else {
|
61 | loaded_modules[module_name].push(module_version_query);
|
62 | }
|
63 | if (module_version_query.match(/^(\.|\/)/)) {
|
64 | module_path = module_version_query;
|
65 | module_config = new autocode(module_path).config;
|
66 | if (module_config.imports) {
|
67 | loadModules(module_config.imports);
|
68 | } else {
|
69 | loadModules(module_config.modules);
|
70 | }
|
71 | continue;
|
72 | }
|
73 | console.log("\n" + ' UPDATE '.bgBlue.white + (" " + module_name + " " + module_version_query + " ").bgWhite.black);
|
74 | headers = {
|
75 | 'User-Agent': 'Crystal Autocode <support@autocode.run> (https://autocode.run/autocode)'
|
76 | };
|
77 | access_token_url = '';
|
78 | if (process.env.GITHUB_ACCESS_TOKEN) {
|
79 | access_token_url += "?access_token=" + process.env.GITHUB_ACCESS_TOKEN;
|
80 | }
|
81 | if (module_version_query === 'latest') {
|
82 | url = "https://api.github.com/repos/" + module_name + "/releases/latest" + access_token_url;
|
83 | } else {
|
84 | url = "https://api.github.com/repos/" + module_name + "/releases" + access_token_url;
|
85 | }
|
86 | resp = request('get', url, {
|
87 | headers: headers
|
88 | });
|
89 | if (resp.statusCode !== 200) {
|
90 | throw new Error("Module (" + module_name + ") does not exist in the Crystal Hub.");
|
91 | }
|
92 | if (module_version_query === 'latest') {
|
93 | release = JSON.parse(resp.body.toString());
|
94 | module_version = semver.clean(release.tag_name);
|
95 | tarball_url = release.tarball_url;
|
96 | } else {
|
97 | releases = JSON.parse(resp.body.toString());
|
98 | if (!releases[0]) {
|
99 | throw new Error("Repository not found for module: " + module_name);
|
100 | }
|
101 | for (j = 0, len = releases.length; j < len; j++) {
|
102 | release = releases[j];
|
103 | if (semver.satisfies(release.tag_name, module_version_query)) {
|
104 | module_version = semver.clean(release.tag_name);
|
105 | tarball_url = release.tarball_url;
|
106 | break;
|
107 | }
|
108 | }
|
109 | if (!module_version) {
|
110 | throw new Error("No matches for Module (" + module_name + ") with version (" + module_version_query + ")");
|
111 | }
|
112 | }
|
113 | console.log(' DOWNLOAD '.bgGreen.white + (" " + module_version + " ").bgWhite.black);
|
114 | module_path = "" + path + config.host + "/" + module_path_name + "/" + module_version;
|
115 | url = "" + tarball_url + access_token_url;
|
116 | response = request('get', url, {
|
117 | headers: headers
|
118 | });
|
119 | data = zlib.gunzipSync(response.body);
|
120 | untar.untar(data).forEach(function(file) {
|
121 | var buffer, file_path, filename, i, link_path;
|
122 | filename = file.filename.split('/').slice(1).join('/');
|
123 | file_path = require('path').dirname(filename);
|
124 | mkdirp.sync(module_path + "/" + file_path);
|
125 | buffer = new Buffer(file.fileData.length);
|
126 | i = 0;
|
127 | while (i < file.fileData.length) {
|
128 | buffer.writeUInt8(file.fileData[i], i);
|
129 | i++;
|
130 | }
|
131 | fs.writeFileSync(module_path + "/" + filename, buffer);
|
132 | if (module_version_query === 'latest') {
|
133 | link_path = "" + path + config.host + "/" + module_path_name + "/latest";
|
134 | if (fs.existsSync(link_path)) {
|
135 | fs.unlinkSync(link_path);
|
136 | }
|
137 | return fs.symlinkSync(module_path, link_path);
|
138 | }
|
139 | });
|
140 | submodules.push(module_path);
|
141 | module_config = new autocode(module_path).config;
|
142 | if (module_config.imports) {
|
143 | results.push(loadModules(module_config.imports));
|
144 | } else {
|
145 | results.push(loadModules(module_config.modules));
|
146 | }
|
147 | }
|
148 | return results;
|
149 | };
|
150 | loadModules(modules);
|
151 | for (j = 0, len = submodules.length; j < len; j++) {
|
152 | submodule = submodules[j];
|
153 | project = new autocode(submodule);
|
154 | project.build({
|
155 | skipGeneration: true
|
156 | });
|
157 | }
|
158 | return console.log("\n" + ' DONE! '.bgGreen.white);
|
159 | };
|
160 |
|
161 | module.exports = update;
|
162 |
|
163 | }).call(this);
|