UNPKG

5.88 kBJavaScriptView Raw
1// Generated by CoffeeScript 1.10.0
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);