/
release.js
142 lines (128 loc) · 3.72 KB
/
release.js
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/env node
var fs = require('fs'),
xml2js = require('xml2js'),
commandLineArgs = require('command-line-args'),
Git = require('nodegit'),
semverSort = require('semver-sort'),
semver = require('semver'),
exec = require('child_process').exec;
const RELEASE_VALUES = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease'];
/**
* Command options definition
*/
var optionDefinitions = [{
name: 'current',
alias: 'c',
type: String,
defaultOption: ''
}, {
name: 'release',
alias: 'r',
type: String,
defaultOption: 'minor'
}];
/**
* Check if current working tree contains pending changes
* @param {*} repository
*/
var checkPendingChanges = function (repository) {
return new Promise(function (resolve, reject) {
repository.getStatus({}).then(function (arrayStatusFile) {
if (!arrayStatusFile || arrayStatusFile.length === 0) {
resolve(false);
} else {
resolve(true);
}
});
});
};
/**
* Write version in package.json file
* @param {*} version
*/
var setPackageJsonVersion = function (version) {
return new Promise(function (resolve, reject) {
// Read file
var file = require('./package.json');
file.version = version;
fs.writeFile('./package.json', JSON.stringify(file, true, 2), function (err) {
if (err) {
console.error('Error writing version to package.json file: ' + err);
reject();
} else {
resolve();
}
});
});
};
var setPluginVersion = function (version) {
return new Promise(function (resolve, reject) {
let parser = new xml2js.Parser();
fs.readFile('./plugin.xml', function (err, data) {
parser.parseString(data, function (err, result) {
if (err) {
console.log(err);
reject();
} else {
result.plugin.$.version = version;
// create a new builder object and then convert our json back to xml
let builder = new xml2js.Builder({
'pretty': true,
'indent': ' '
});
let xml = builder.buildObject(result);
fs.writeFile('./plugin.xml', xml, function (err, data) {
if (err) {
console.log(err);
reject();
} else {
console.log("plugin.xml successfully updated");
resolve();
}
});
}
});
});
});
};
var createVersion = function (version, repository) {
// Increment version in package.json
setPackageJsonVersion(version).then(function () {
// Increment version in plugin.xml
setPluginVersion(version).then(function () {
})
});
};
/**
* Increment last git tag with release type specified in command line
* @param {*} repository
* @param {*} tags
*/
var incrementVersion = function (repository) {
var version = '0.0.0';
var nextVersion;
// Get command line options and execute the proper action
var options = commandLineArgs(optionDefinitions);
if (options.current) {
version = options.current;
}
if (RELEASE_VALUES.indexOf(options.release) === -1) {
console.error('Error: wrong value for release parameter. Valid values are: ' + JSON.stringify(RELEASE_VALUES));
} else {
if (options.release.startsWith('pre')) {
nextVersion = semver.inc(version, options.release, 'RC');
} else {
nextVersion = semver.inc(version, options.release);
}
createVersion(nextVersion, repository);
}
};
// ------------------------ MAIN ---------------------
// Get current repo
Git.Repository.open("./").then(function (repository) {
// Check there are no pending changes to commit
checkPendingChanges(repository).then(function (pendingChanges) {
// Increment version
incrementVersion(repository);
});
});