1 | "use strict";
|
2 |
|
3 | var os = require('os');
|
4 | var path = require('path');
|
5 |
|
6 | var fs = require('fs-extra');
|
7 | var gotZip = require('got-zip');
|
8 | var GitHubApi = require('github');
|
9 | var github = new GitHubApi({
|
10 | version: '3.0.0',
|
11 | protocol: 'https',
|
12 | headers: {
|
13 | 'user-agent': 'cartridge-cli-app'
|
14 | }
|
15 | });
|
16 |
|
17 | var utils = require('./utils');
|
18 |
|
19 | var errorHandler = require('./errorHandler');
|
20 |
|
21 | var releaseServiceApi = {};
|
22 | var _log;
|
23 |
|
24 | var OS_TMP_DIR = os.tmpdir();
|
25 | var CARTRIDGE_FOLDER_REGEX = /^cartridge-cartridge/;
|
26 | var CARTRIDGE_FOLDER_PATH;
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 | releaseServiceApi.downloadLatestRelease = function(options) {
|
33 | _log = utils.getLogInstance(options);
|
34 |
|
35 | return getLatestGitHubRelease()
|
36 | .then(downloadGitHubZipFile)
|
37 | .then(getCartridgeFolderPath)
|
38 | .catch(function(err) {
|
39 | errorHandler(err)
|
40 | })
|
41 | }
|
42 |
|
43 |
|
44 |
|
45 |
|
46 | releaseServiceApi.deleteReleaseTmpDirectory = function() {
|
47 | _log.debug('Deleting cartridge temp directory in ' + OS_TMP_DIR);
|
48 |
|
49 | fs.removeSync(CARTRIDGE_FOLDER_PATH)
|
50 | }
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | function getCartridgeFolderPath(args) {
|
57 |
|
58 | return new Promise(function(resolve, reject) {
|
59 | fs.readdir(args.dest, function(err, files) {
|
60 |
|
61 | if(err) reject(err);
|
62 |
|
63 | for (var i = 0; i < files.length; i++) {
|
64 |
|
65 | if(CARTRIDGE_FOLDER_REGEX.test(files[i])) {
|
66 | CARTRIDGE_FOLDER_PATH = path.join(args.dest, files[i])
|
67 | resolve(CARTRIDGE_FOLDER_PATH);
|
68 | }
|
69 | }
|
70 | })
|
71 | });
|
72 | }
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 | function downloadGitHubZipFile(downloadUrl) {
|
79 | _log.debug('Downloading release from URL ' + downloadUrl);
|
80 | _log.debug('');
|
81 |
|
82 | return gotZip(downloadUrl, {
|
83 | dest: OS_TMP_DIR,
|
84 | extract: true,
|
85 | cleanup: true,
|
86 | strip: 0
|
87 | })
|
88 | }
|
89 |
|
90 |
|
91 |
|
92 |
|
93 | function getLatestGitHubRelease() {
|
94 | _log.debug('Getting latest release URL from GitHub');
|
95 |
|
96 | return new Promise(function(resolve, reject) {
|
97 | github.releases.listReleases({
|
98 | owner: 'cartridge',
|
99 | repo: 'cartridge',
|
100 | page: 1,
|
101 | per_page: 1
|
102 | }, function(err, data) {
|
103 | if(err) return reject(err);
|
104 |
|
105 | _log.debug('Release ' + data[0].name + ' is latest');
|
106 |
|
107 | if(data.length > 0) {
|
108 | resolve(data[0].zipball_url);
|
109 | }
|
110 | });
|
111 | });
|
112 | }
|
113 |
|
114 | module.exports = releaseServiceApi;
|