1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | 'use strict';
|
10 |
|
11 | var chg = module.exports = {};
|
12 |
|
13 | var fs = require('fs');
|
14 | var shell = require('shelljs');
|
15 | var moment = require('moment');
|
16 | var semver = require('semver');
|
17 |
|
18 | var changeLogFile = 'CHANGELOG.md';
|
19 | var unreleasedTitle = '## HEAD (Unreleased)\n';
|
20 | var noItems = '_(none)_';
|
21 | var divider = '--------------------\n\n';
|
22 |
|
23 | var ERR_NO_CHANGELOG = changeLogFile+' does not exist. Change to the directory where it does exist, or run `init` to create one in the current directory.';
|
24 |
|
25 | function defCallback(){}
|
26 |
|
27 | function getChangeLog(){
|
28 | if (!fs.existsSync(changeLogFile)) {
|
29 | return null;
|
30 | }
|
31 | return fs.readFileSync(changeLogFile, 'utf8');
|
32 | }
|
33 |
|
34 | chg.init = function(options, callback){
|
35 | options = options || {};
|
36 | callback = callback || defCallback;
|
37 |
|
38 | if (fs.existsSync(changeLogFile)){
|
39 | return callback(changeLogFile + ' already exists');
|
40 | }
|
41 |
|
42 | var contents = 'CHANGELOG\n=========\n\n';
|
43 | contents += unreleasedTitle + noItems + '\n\n' + divider;
|
44 |
|
45 | fs.writeFileSync(changeLogFile, contents, 'utf8');
|
46 |
|
47 | callback(null, changeLogFile+' created');
|
48 | };
|
49 |
|
50 | chg.delete = function(options, callback){
|
51 | options = options || {};
|
52 | callback = callback || defCallback;
|
53 |
|
54 | if (fs.existsSync(changeLogFile)){
|
55 | shell.rm(changeLogFile);
|
56 | callback(null, changeLogFile+' deleted');
|
57 | } else {
|
58 | callback(changeLogFile+' does not exist');
|
59 | }
|
60 | };
|
61 |
|
62 | chg.add = function(line, options, callback){
|
63 | var contents, sections, top;
|
64 |
|
65 | options = options || {};
|
66 | callback = callback || defCallback;
|
67 |
|
68 |
|
69 | contents = getChangeLog();
|
70 | if (!contents) {
|
71 | return callback(ERR_NO_CHANGELOG);
|
72 | }
|
73 |
|
74 |
|
75 | contents = contents.replace(unreleasedTitle + noItems + '\n', unreleasedTitle);
|
76 |
|
77 |
|
78 | sections = contents.split('\n'+divider);
|
79 |
|
80 | top = sections[0] + '* ' + line + '\n\n';
|
81 |
|
82 |
|
83 | contents = top + divider + sections[1];
|
84 | fs.writeFileSync(changeLogFile, contents, 'utf8');
|
85 |
|
86 | callback(null, 'Change added');
|
87 | };
|
88 |
|
89 | chg.release = function(version, options, callback){
|
90 | var date, contents, changes, title, pkgVersion;
|
91 |
|
92 | callback = callback || defCallback;
|
93 | options = options || {};
|
94 | date = options.date || moment().format('YYYY-MM-DD');
|
95 | version = version || options.version || null;
|
96 |
|
97 | if (!version) {
|
98 | return callback('Version required');
|
99 | }
|
100 |
|
101 |
|
102 | if (['major','minor','patch'].indexOf(version) != -1) {
|
103 | if (fs.existsSync('./package.json')) {
|
104 | pkgVersion = require(process.cwd()+'/package.json').version;
|
105 | version = semver.inc(pkgVersion, version);
|
106 | } else {
|
107 | callback('No package.json was found');
|
108 | }
|
109 | }
|
110 |
|
111 |
|
112 | contents = getChangeLog();
|
113 | if (!contents) {
|
114 | return callback(ERR_NO_CHANGELOG);
|
115 | }
|
116 |
|
117 |
|
118 | changes = contents.split(unreleasedTitle)[1];
|
119 |
|
120 | changes = changes.split('\n\n')[0];
|
121 |
|
122 | contents = contents.replace(changes, noItems);
|
123 |
|
124 |
|
125 | title = '##' + ' ' + version + ' ('+ date +')\n';
|
126 |
|
127 | contents = contents.replace(divider, divider + title + changes + '\n\n');
|
128 |
|
129 | fs.writeFileSync(changeLogFile, contents, 'utf8');
|
130 |
|
131 | callback(null, 'Changelog updated with new release');
|
132 | }; |
\ | No newline at end of file |