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 |
|
17 | var changeLogFile = 'CHANGELOG.md';
|
18 | var unreleasedTitle = '## HEAD (Unreleased)\n';
|
19 | var noItems = '_(none)_';
|
20 | var divider = '--------------------\n\n';
|
21 |
|
22 | 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.';
|
23 |
|
24 | function defCallback(){}
|
25 |
|
26 | function getChangeLog(){
|
27 | if (!fs.existsSync(changeLogFile)) {
|
28 | return null;
|
29 | }
|
30 | return fs.readFileSync(changeLogFile, 'utf8');
|
31 | }
|
32 |
|
33 | chg.init = function(options, callback){
|
34 | options = options || {};
|
35 | callback = callback || defCallback;
|
36 |
|
37 | if (fs.existsSync(changeLogFile)){
|
38 | return callback(changeLogFile + ' already exists');
|
39 | }
|
40 |
|
41 | var contents = 'CHANGELOG\n=========\n\n';
|
42 | contents += unreleasedTitle + noItems + '\n\n' + divider;
|
43 |
|
44 | fs.writeFileSync(changeLogFile, contents, 'utf8');
|
45 |
|
46 | callback(null, changeLogFile+' created');
|
47 | };
|
48 |
|
49 | chg.delete = function(options, callback){
|
50 | options = options || {};
|
51 | callback = callback || defCallback;
|
52 |
|
53 | if (fs.existsSync(changeLogFile)){
|
54 | shell.rm(changeLogFile);
|
55 | callback(null, changeLogFile+' deleted');
|
56 | } else {
|
57 | callback(changeLogFile+' does not exist');
|
58 | }
|
59 | };
|
60 |
|
61 | chg.add = function(line, options, callback){
|
62 | var contents, sections, top;
|
63 |
|
64 | options = options || {};
|
65 | callback = callback || defCallback;
|
66 |
|
67 |
|
68 | contents = getChangeLog();
|
69 | if (!contents) {
|
70 | return callback(ERR_NO_CHANGELOG);
|
71 | }
|
72 |
|
73 |
|
74 | contents = contents.replace(unreleasedTitle + noItems + '\n', unreleasedTitle);
|
75 |
|
76 |
|
77 | sections = contents.split('\n'+divider);
|
78 |
|
79 | top = sections[0] + '* ' + line + '\n\n';
|
80 |
|
81 |
|
82 | contents = top + divider + sections[1];
|
83 | fs.writeFileSync(changeLogFile, contents, 'utf8');
|
84 |
|
85 | callback(null, 'Change added');
|
86 | };
|
87 |
|
88 | chg.release = function(version, options, callback){
|
89 | var date, contents, changes, title;
|
90 |
|
91 | callback = callback || defCallback;
|
92 | options = options || {};
|
93 | date = options.date || moment().format('YYYY-MM-DD');
|
94 | version = version || options.version || null;
|
95 |
|
96 | if (!version) {
|
97 | return callback('Version number required');
|
98 | }
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 |
|
105 | contents = getChangeLog();
|
106 | if (!contents) {
|
107 | return callback(ERR_NO_CHANGELOG);
|
108 | }
|
109 |
|
110 |
|
111 | changes = contents.split(unreleasedTitle)[1];
|
112 |
|
113 | changes = changes.split('\n\n')[0];
|
114 |
|
115 | contents = contents.replace(changes, noItems);
|
116 |
|
117 |
|
118 | title = '##' + ' ' + version + ' ('+ date +')\n';
|
119 |
|
120 | contents = contents.replace(divider, divider + title + changes + '\n\n');
|
121 |
|
122 | fs.writeFileSync(changeLogFile, contents, 'utf8');
|
123 |
|
124 | callback(null, 'Changelog updated with new release');
|
125 | }; |
\ | No newline at end of file |