chlog 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/exe/chlog +82 -0
  3. data/lib/chlog/version.rb +16 -0
  4. data/lib/chlog.rb +340 -8
  5. metadata +8 -7
  6. data/bin/chlog +0 -422
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e0955eb92616d3ab8bbc9a1df682ac61afca55ab2ee8c1dad5d33d7cae7714c
4
- data.tar.gz: bd22473954d3a15da39117a4b3dfe917526cc6eb7ca91475d31b7e86204e6964
3
+ metadata.gz: 9c501c040c85ebeba5c6171f5dfb6dcb6fddec08798166cd1beb0fce54dd27df
4
+ data.tar.gz: ec9bc451993d99992ae38d5ee2db80190e1fc55e5853d8665e6d31186be941cc
5
5
  SHA512:
6
- metadata.gz: be7404fe7d69f6197bad15a51a893fb7825aff2e7e7c710b4263f225d406c44ff1da0f62e3383021ecaea129c10ec582c31b23e88b0f2272b0063afdcad19772
7
- data.tar.gz: 0c5ac3d320c75ea464b1a10a016a57d8d25988bc2b13bb350f3927248966c873a4506571c0671e0aeba6f14c0c995c6060130063a749e5af847a9ccf8cc7810a
6
+ metadata.gz: 2bc058d3d29b835fdfea8577cec9195e75b2b30069f2b8ca4e49f942a228b3de600c741fdf302701dc02579cb9db62685990297a0c330b69d8993ecd838b1ecb
7
+ data.tar.gz: d8517e795b3bb1e4d9b9666bbeabcf92ac987e3a280275644ac5779e03e8fd68149f62d28c3c447da38087ddf5c2a6f9de67d55350b18845cdb5a6f531f6407e
data/exe/chlog ADDED
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+ # ------------------------------------------------------
3
+ # File : chlog.rb
4
+ # Authors : Aoran Zeng <ccmywish@qq.com>
5
+ # Created on : <2022-03-18>
6
+ # Last modified : <2023-05-09>
7
+ #
8
+ # chlog:
9
+ #
10
+ # Maintain your project's Changelog on the cli.
11
+ # ------------------------------------------------------
12
+
13
+ require 'chlog'
14
+
15
+ module Chlog::CLI
16
+
17
+ def self.run
18
+
19
+ args = $*.dup
20
+
21
+ if args.size == 0
22
+ help or exit
23
+ end
24
+
25
+ action = args[0]
26
+
27
+ case action
28
+ when "-h", "--help" then help or exit end
29
+
30
+ logger = Chlog::Logger.new
31
+
32
+ case action
33
+ when "-g" then exit logger.generate_changelog
34
+ when "-r" then exit logger.release_new_version(args[1])
35
+ end
36
+
37
+ if args[1] =~ /^--(.*)/
38
+ logger.sub_category = $1
39
+ logger.log = args[2..].join(' ')
40
+ else
41
+ logger.sub_category = nil
42
+ logger.log = args[1..].join(' ')
43
+ end
44
+
45
+ case action
46
+ when /-[nebscd]/
47
+ logger.take_action(action)
48
+ else
49
+ # action =~ /^-[^-]*$/
50
+ abort "chlog: Unknown option!"
51
+ end
52
+ end
53
+
54
+
55
+ def self.help
56
+ puts <<~EOH
57
+ chlog (v#{Chlog::GEM_VERSION}): Help maintain the Changelog of your projects
58
+
59
+ Usage:
60
+
61
+ chlog -g Generate CHANGELOG.md in git root
62
+ chlog -r <3.14> Release version to v3.14
63
+
64
+ Add log:
65
+
66
+ chlog <-main category> [--sub category] <log>
67
+
68
+ Main Category:
69
+
70
+ -n Add log to New features
71
+ -e Add log to Enhancements
72
+ -b Add log to Bug fixes
73
+ -s Add log to Security
74
+ -c Add log to Compatibility
75
+ -d Add log to Deprecations
76
+
77
+ EOH
78
+ end
79
+
80
+ end
81
+
82
+ Chlog::CLI.run
@@ -0,0 +1,16 @@
1
+ # ---------------------------------------------------------------
2
+ # File : version.rb
3
+ # Authors : Aoran Zeng <ccmywish@qq.com>
4
+ # Created on : <2023-05-09>
5
+ # Last modified : <2023-05-09>
6
+ #
7
+ # version:
8
+ #
9
+ # Lib version
10
+ # ---------------------------------------------------------------
11
+
12
+ module Chlog
13
+
14
+ GEM_VERSION = "0.9.0"
15
+
16
+ end
data/lib/chlog.rb CHANGED
@@ -1,20 +1,15 @@
1
1
  # ------------------------------------------------------
2
2
  # File : chlog.rb
3
- # Authors : ccmywish <ccmywish@qq.com>
3
+ # Authors : Aoran Zeng <ccmywish@qq.com>
4
4
  # Created on : <2022-04-15>
5
- # Last modified : <2023-02-12>
5
+ # Last modified : <2023-05-09>
6
6
  #
7
7
  # chlog:
8
8
  #
9
9
  # Maintain your project's Changelog on the cli.
10
10
  # ------------------------------------------------------
11
11
 
12
- module Chlog
13
-
14
- GEM_VERSION = "0.8.1"
15
-
16
- end
17
-
12
+ require_relative 'chlog/version'
18
13
 
19
14
  class Chlog::Logger
20
15
 
@@ -83,3 +78,340 @@ class Chlog::Logger
83
78
  end
84
79
 
85
80
  end
81
+
82
+
83
+ class Chlog::Logger
84
+
85
+ def match_unreleased?(str)
86
+ str =~ /^## \[Unreleased\]\(.*\) \(\d{4}-\d\d-\d\d\)/
87
+ end
88
+
89
+ def match_unreleased_fail!(str)
90
+ unless match_unreleased?(str)
91
+ puts "chlog: Unmatched format with chlog"
92
+ puts
93
+ # "#{lns[1][1..]}"
94
+ abort "Unreleased version must be the third line"
95
+ end
96
+ end
97
+
98
+ def match_new_features?(str)
99
+ str =~ /^### New features:/
100
+ end
101
+
102
+ def match_enhancements?(str)
103
+ str =~ /^### Enhancements:/
104
+ end
105
+
106
+ def match_bug_fixes?(str)
107
+ str =~ /^### Bug fixes:/
108
+ end
109
+
110
+ def match_security?(str)
111
+ str =~ /^### Security:/
112
+ end
113
+
114
+ def match_compatibility?(str)
115
+ str =~ /^### Compatibility:/
116
+ end
117
+
118
+ def match_deprecations?(str)
119
+ str =~ /^### Deprecations:/
120
+ end
121
+
122
+
123
+ def next_version_index(lns_array)
124
+ nvi = lns_array[3..].each_with_index {break _2 if _1.start_with?("## [") }
125
+ nvi += 3
126
+ end
127
+
128
+ def next_category_index(lns_array)
129
+ nci = lns_array[3...nvi].each_with_index {break _2 if _1.start_with?("### ") }
130
+
131
+ # The not match return value is not nil!! But an array!!
132
+ if nci.is_a(Integer) then nci += 3
133
+ else nil end
134
+ end
135
+
136
+ =begin
137
+ ### New features:
138
+
139
+ - xaaaaa
140
+ - xbbbbb
141
+ - xccccc [-> this]
142
+ =end
143
+ def find_main_category_last_list_item_index(lns,
144
+ main_cat_index,
145
+ first_lower_order_category_index)
146
+ mci = main_cat_index
147
+ nci = first_lower_order_category_index
148
+
149
+ list_i = lns[mci+2..nci].each_with_index do
150
+ break _2 if _1 !~ /^- .*/
151
+ end
152
+ list_i += mci+2 - 1
153
+ end
154
+
155
+
156
+ LIST__Feature = %w[
157
+ new_features enhancements bug_fixes
158
+ security compatibility deprecations
159
+ ]
160
+
161
+ # New features
162
+ # Enhancements
163
+ # Bug fixes
164
+ # Security
165
+ # Compatibility
166
+ # Deprecations
167
+ LIST__Main_Category = LIST__Feature.map do
168
+ _1.split('_').join(' ').capitalize
169
+ end
170
+
171
+ # match_new_features?
172
+ # match_enhancements?
173
+ # match_ ...
174
+ LIST__Match_Method = LIST__Feature.map do
175
+ ('match_' + _1 + '?').to_sym
176
+ end
177
+
178
+ =begin
179
+ {
180
+ 1 => :add_to_new_features,
181
+ 2 => :add_to_enhancements,
182
+ ...
183
+ }
184
+ =end
185
+ HASH__Order_To_AddTo_Method = ([1,2,3,4,5,6].zip LIST__Feature.map {|m| ('add_to_' + m).to_sym }).to_h
186
+
187
+
188
+
189
+ def take_action(action)
190
+ options = "nebscd"
191
+
192
+ =begin
193
+ {
194
+ "-n" => "new_features", "-e" => "enhancements", "-b" => "bug_fixes",
195
+ "-s" => "security", "-c" => "compatibility", "-d" => "deprecations"
196
+ }
197
+ =end
198
+ action_table = options.chars.map do |op|
199
+ '-' + op
200
+ end.zip(LIST__Feature).to_h
201
+
202
+ public_send "add_to_#{action_table[action]}"
203
+ end
204
+
205
+
206
+ def first_lower_order_category_index(lns_array, category_order)
207
+
208
+ o = category_order
209
+
210
+ nvi = next_version_index(lns_array)
211
+
212
+ while o < LIST__Match_Method.size
213
+ lns_array[0...nvi].each_with_index do
214
+ return _2 if send(LIST__Match_Method[o], _1)
215
+ end
216
+ o += 1
217
+ end
218
+
219
+ # Next version above
220
+ return (nvi - 2)
221
+ end
222
+
223
+
224
+ # A meta function: do the real work other 6 functions delegate
225
+ #
226
+ # This function detect the main category, and then handle the
227
+ # sub category.
228
+ def meta_add_to_a_category(log, main_category_order, category)
229
+
230
+ content = get_changelog
231
+ lns = content.lines
232
+
233
+ match_unreleased_fail!(lns[2])
234
+
235
+ nvi = next_version_index(lns)
236
+ # To find the existing category line
237
+ main_cat_i = lns[0...nvi].each_with_index do
238
+ # Adjust to index of the order table
239
+ break _2 if send(LIST__Match_Method[main_category_order-1], _1)
240
+ end
241
+
242
+ #
243
+ # Always update to latest time when making a log
244
+ #
245
+ # We must add a "\n" because every element of the array
246
+ # is a sentence with a trailing newline, then they can
247
+ # be 'joined' to a working long string
248
+ #
249
+ lns[2] = UNRELEASED_TITLE + "\n"
250
+
251
+ f_l_o_c_i = first_lower_order_category_index(lns, main_category_order)
252
+
253
+ if main_cat_i.class != Integer
254
+ ################################################################################
255
+ # The main category not exists
256
+ ################################################################################
257
+
258
+
259
+ ########################################
260
+ if @sub_category
261
+
262
+ # Because the main category not exists,
263
+ # nor does the sub category
264
+ #
265
+ sub_cat_i = f_l_o_c_i
266
+ to_wr = lns[0...sub_cat_i].join + "### #{category}:\n\n" + "**#{@sub_category}**\n\n" + ' - ' + log + "\n\n"
267
+ File.write(@changelog, to_wr + lns[sub_cat_i..].join)
268
+
269
+ puts "chlog: Add log to #{category}/#{@sub_category}"
270
+ return
271
+ end # end of if @sub_category
272
+ ########################################
273
+
274
+ # situation: no sub category
275
+
276
+ # Not need adjust to the index of the order table
277
+ log_loc = f_l_o_c_i
278
+ puts "chlog: Add '#{category}' category"
279
+ to_wr = lns[0...(log_loc)].join + "### #{category}:\n\n" + '- ' + log + "\n"
280
+ File.write(@changelog, to_wr + lns[log_loc-1..].join)
281
+
282
+ else
283
+ ################################################################################
284
+ # The main category exists
285
+ ################################################################################
286
+
287
+
288
+ ########################################
289
+ if @sub_category
290
+
291
+ # from first list item to next main cat
292
+ # search if sub cat already exists
293
+ sub_cat_i = lns[main_cat_i+2...f_l_o_c_i].each_with_index do
294
+ break _2 if _1 =~ /^\*\*#{@sub_category}\*\*/
295
+ end
296
+
297
+ if !sub_cat_i.is_a?(Integer)
298
+ # the sub category not exists
299
+
300
+ sub_cat_i = 2 + find_main_category_last_list_item_index(lns,main_cat_i,f_l_o_c_i)
301
+ to_wr = lns[0...sub_cat_i].join + "**#{@sub_category}**\n\n" + ' - ' + log + "\n\n"
302
+ File.write(@changelog, to_wr + lns[sub_cat_i..].join)
303
+ else
304
+ # the sub category exists
305
+
306
+ sub_cat_i += main_cat_i+2
307
+ to_wr = lns[0..sub_cat_i+1].join + ' - ' + log + "\n"
308
+ File.write(@changelog, to_wr + lns[sub_cat_i+2..].join)
309
+ end
310
+
311
+ puts "chlog: Add log to #{category}/#{@sub_category}"
312
+ return
313
+ end # end of if @sub_category
314
+ ########################################
315
+
316
+
317
+
318
+ # situation: no sub category
319
+
320
+ to_wr = lns[0..main_cat_i+1].join + '- ' + log + "\n"
321
+
322
+ # main category list should be separated with
323
+ # sub category
324
+ if lns[main_cat_i+2] =~ /\*\*.*/
325
+ to_wr += "\n"
326
+ end
327
+ File.write(@changelog, to_wr + lns[main_cat_i+2..].join)
328
+ end
329
+
330
+ puts "chlog: Add log to #{category}"
331
+ end
332
+
333
+
334
+
335
+ # main category order: 1
336
+ def add_to_new_features
337
+ meta_add_to_a_category(@log, 1, "New features")
338
+ end
339
+
340
+ # main category order: 2
341
+ def add_to_enhancements
342
+ meta_add_to_a_category(@log, 2, "Enhancements")
343
+ end
344
+
345
+ # main_category_order: 3
346
+ def add_to_bug_fixes
347
+ meta_add_to_a_category(@log, 3, "Bug fixes")
348
+ end
349
+
350
+ # main_category_order: 4
351
+ def add_to_security
352
+ meta_add_to_a_category(@log, 4, "Security")
353
+ end
354
+
355
+ # main_category_order: 5
356
+ def add_to_compatibility
357
+ meta_add_to_a_category(@log, 5, "Compatibility")
358
+ end
359
+
360
+ # The last of order table
361
+ # main_category_order: 6
362
+ def add_to_deprecations
363
+ meta_add_to_a_category(@log, 6, "Deprecations")
364
+ end
365
+
366
+ # Release a version
367
+ def release_new_version(ver)
368
+ if ver.nil?
369
+ puts "chlog: No version supplied!"; puts; abort "Use chlog -r <version>!"
370
+ end
371
+
372
+ if !ver.downcase.start_with?('v') and ver[0].match? /\d/
373
+ ver = 'v' + ver
374
+ end
375
+
376
+ content = get_changelog
377
+ lns = content.lines
378
+
379
+ match_unreleased_fail!(lns[2])
380
+
381
+ header = <<~EOF
382
+ # Changelog
383
+
384
+ ## [Unreleased](#) (#{TODAY})
385
+
386
+ <br>
387
+
388
+ EOF
389
+
390
+ new_version = "## [#{ver}](#) (#{TODAY})\n"
391
+ new_cont = header + new_version + lns[3..].join('')
392
+ File.write(@changelog, new_cont)
393
+ puts "chlog: Release #{ver} in Changelog!" or return true
394
+ end
395
+
396
+
397
+ # Help user interactively
398
+ def ask_user_category
399
+ category = @highline.choose do |menu|
400
+ menu.index_color = :rgb_77bbff
401
+ menu.prompt = "What main category?"
402
+ # return number!!! not string!!!
403
+ menu.choices(*LIST__Main_Category)
404
+ end
405
+
406
+ option = LIST__Main_Category.index(category)
407
+
408
+ if @sub_category.nil?
409
+ sub = @highline.ask "What sub category? [NIL/sub]"
410
+ case sub
411
+ when '' then @sub_category = nil
412
+ else @sub_category = sub end
413
+ end
414
+ return option
415
+ end
416
+
417
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chlog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
- - ccmywish
7
+ - Aoran Zeng
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-12 00:00:00.000000000 Z
11
+ date: 2023-05-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -34,8 +34,9 @@ executables:
34
34
  extensions: []
35
35
  extra_rdoc_files: []
36
36
  files:
37
- - bin/chlog
37
+ - exe/chlog
38
38
  - lib/chlog.rb
39
+ - lib/chlog/version.rb
39
40
  homepage: https://github.com/ccmywish/chlog
40
41
  licenses:
41
42
  - MIT
@@ -57,8 +58,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
58
  - !ruby/object:Gem::Version
58
59
  version: '0'
59
60
  requirements: []
60
- rubygems_version: 3.3.26
61
+ rubygems_version: 3.4.8
61
62
  signing_key:
62
63
  specification_version: 4
63
- summary: 'chlog: help maintain Changelog'
64
+ summary: Help maintain Changelog on the command line!
64
65
  test_files: []
data/bin/chlog DELETED
@@ -1,422 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # ------------------------------------------------------
3
- # File : chlog.rb
4
- # Authors : ccmywish <ccmywish@qq.com>
5
- # Created on : <2022-03-18>
6
- # Last modified : <2023-02-12>
7
- #
8
- # chlog:
9
- #
10
- # Maintain your project's Changelog on the cli.
11
- # ------------------------------------------------------
12
-
13
- require 'chlog'
14
-
15
- class Chlog::CliHandler
16
-
17
- def initialize(args)
18
-
19
- if args.size == 0
20
- help or exit
21
- end
22
-
23
- action = args[0]
24
-
25
- case action
26
- when "-h", "--help" then help or exit end
27
-
28
- logger = Chlog::Logger.new
29
-
30
- case action
31
- when "-g" then exit logger.generate_changelog
32
- when "-r" then exit logger.release_new_version(args[1])
33
- end
34
-
35
- if args[1] =~ /^--(.*)/
36
- logger.sub_category = $1
37
- logger.log = args[2..].join(' ')
38
- else
39
- logger.sub_category = nil
40
- logger.log = args[1..].join(' ')
41
- end
42
-
43
- case action
44
- when /-[nebscd]/
45
- logger.take_action(action)
46
- else
47
- # action =~ /^-[^-]*$/
48
- abort "chlog: Unknown option!"
49
- end
50
- end
51
-
52
-
53
- def help
54
- puts <<~EOH
55
- chlog (v#{Chlog::GEM_VERSION}): Help maintain the Changelog of your projects
56
-
57
- Usage:
58
-
59
- chlog -g Generate CHANGELOG.md in git root
60
- chlog -r <3.14> Release version to v3.14
61
-
62
- Add log:
63
-
64
- chlog <-main category> [--sub category] <log>
65
-
66
- Main Category:
67
-
68
- -n Add log to New features
69
- -e Add log to Enhancements
70
- -b Add log to Bug fixes
71
- -s Add log to Security
72
- -c Add log to Compatibility
73
- -d Add log to Deprecations
74
-
75
- EOH
76
- end
77
-
78
- end
79
-
80
-
81
-
82
- class Chlog::Logger
83
-
84
- def match_unreleased?(str)
85
- str =~ /^## \[Unreleased\]\(.*\) \(\d{4}-\d\d-\d\d\)/
86
- end
87
-
88
- def match_unreleased_fail!(str)
89
- unless match_unreleased?(str)
90
- puts "chlog: Unmatched format with chlog"
91
- puts
92
- # "#{lns[1][1..]}"
93
- abort "Unreleased version must be the third line"
94
- end
95
- end
96
-
97
- def match_new_features?(str)
98
- str =~ /^### New features:/
99
- end
100
-
101
- def match_enhancements?(str)
102
- str =~ /^### Enhancements:/
103
- end
104
-
105
- def match_bug_fixes?(str)
106
- str =~ /^### Bug fixes:/
107
- end
108
-
109
- def match_security?(str)
110
- str =~ /^### Security:/
111
- end
112
-
113
- def match_compatibility?(str)
114
- str =~ /^### Compatibility:/
115
- end
116
-
117
- def match_deprecations?(str)
118
- str =~ /^### Deprecations:/
119
- end
120
-
121
-
122
- def next_version_index(lns_array)
123
- nvi = lns_array[3..].each_with_index {break _2 if _1.start_with?("## [") }
124
- nvi += 3
125
- end
126
-
127
- def next_category_index(lns_array)
128
- nci = lns_array[3...nvi].each_with_index {break _2 if _1.start_with?("### ") }
129
-
130
- # The not match return value is not nil!! But an array!!
131
- if nci.is_a(Integer) then nci += 3
132
- else nil end
133
- end
134
-
135
- =begin
136
- ### New features:
137
-
138
- - xaaaaa
139
- - xbbbbb
140
- - xccccc [-> this]
141
- =end
142
- def find_main_category_last_list_item_index(lns,
143
- main_cat_index,
144
- first_lower_order_category_index)
145
- mci = main_cat_index
146
- nci = first_lower_order_category_index
147
-
148
- list_i = lns[mci+2..nci].each_with_index do
149
- break _2 if _1 !~ /^- .*/
150
- end
151
- list_i += mci+2 - 1
152
- end
153
-
154
-
155
- LIST__Feature = %w[
156
- new_features enhancements bug_fixes
157
- security compatibility deprecations
158
- ]
159
-
160
- # New features
161
- # Enhancements
162
- # Bug fixes
163
- # Security
164
- # Compatibility
165
- # Deprecations
166
- LIST__Main_Category = LIST__Feature.map do
167
- _1.split('_').join(' ').capitalize
168
- end
169
-
170
- # match_new_features?
171
- # match_enhancements?
172
- # match_ ...
173
- LIST__Match_Method = LIST__Feature.map do
174
- ('match_' + _1 + '?').to_sym
175
- end
176
-
177
- =begin
178
- {
179
- 1 => :add_to_new_features,
180
- 2 => :add_to_enhancements,
181
- ...
182
- }
183
- =end
184
- HASH__Order_To_AddTo_Method = ([1,2,3,4,5,6].zip LIST__Feature.map {|m| ('add_to_' + m).to_sym }).to_h
185
-
186
-
187
-
188
- def take_action(action)
189
- options = "nebscd"
190
-
191
- =begin
192
- {
193
- "-n" => "new_features", "-e" => "enhancements", "-b" => "bug_fixes",
194
- "-s" => "security", "-c" => "compatibility", "-d" => "deprecations"
195
- }
196
- =end
197
- action_table = options.chars.map do |op|
198
- '-' + op
199
- end.zip(LIST__Feature).to_h
200
-
201
- public_send "add_to_#{action_table[action]}"
202
- end
203
-
204
-
205
- def first_lower_order_category_index(lns_array, category_order)
206
-
207
- o = category_order
208
-
209
- nvi = next_version_index(lns_array)
210
-
211
- while o < LIST__Match_Method.size
212
- lns_array[0...nvi].each_with_index do
213
- return _2 if send(LIST__Match_Method[o], _1)
214
- end
215
- o += 1
216
- end
217
-
218
- # Next version above
219
- return (nvi - 2)
220
- end
221
-
222
-
223
- # A meta function: do the real work other 6 functions delegate
224
- #
225
- # This function detect the main category, and then handle the
226
- # sub category.
227
- def meta_add_to_a_category(log, main_category_order, category)
228
-
229
- content = get_changelog
230
- lns = content.lines
231
-
232
- match_unreleased_fail!(lns[2])
233
-
234
- nvi = next_version_index(lns)
235
- # To find the existing category line
236
- main_cat_i = lns[0...nvi].each_with_index do
237
- # Adjust to index of the order table
238
- break _2 if send(LIST__Match_Method[main_category_order-1], _1)
239
- end
240
-
241
- #
242
- # Always update to latest time when making a log
243
- #
244
- # We must add a "\n" because every element of the array
245
- # is a sentence with a trailing newline, then they can
246
- # be 'joined' to a working long string
247
- #
248
- lns[2] = UNRELEASED_TITLE + "\n"
249
-
250
- f_l_o_c_i = first_lower_order_category_index(lns, main_category_order)
251
-
252
- if main_cat_i.class != Integer
253
- ################################################################################
254
- # The main category not exists
255
- ################################################################################
256
-
257
-
258
- ########################################
259
- if @sub_category
260
-
261
- # Because the main category not exists,
262
- # nor does the sub category
263
- #
264
- sub_cat_i = f_l_o_c_i
265
- to_wr = lns[0...sub_cat_i].join + "### #{category}:\n\n" + "**#{@sub_category}**\n\n" + ' - ' + log + "\n\n"
266
- File.write(@changelog, to_wr + lns[sub_cat_i..].join)
267
-
268
- puts "chlog: Add log to #{category}/#{@sub_category}"
269
- return
270
- end # end of if @sub_category
271
- ########################################
272
-
273
- # situation: no sub category
274
-
275
- # Not need adjust to the index of the order table
276
- log_loc = f_l_o_c_i
277
- puts "chlog: Add '#{category}' category"
278
- to_wr = lns[0...(log_loc)].join + "### #{category}:\n\n" + '- ' + log + "\n"
279
- File.write(@changelog, to_wr + lns[log_loc-1..].join)
280
-
281
- else
282
- ################################################################################
283
- # The main category exists
284
- ################################################################################
285
-
286
-
287
- ########################################
288
- if @sub_category
289
-
290
- # from first list item to next main cat
291
- # search if sub cat already exists
292
- sub_cat_i = lns[main_cat_i+2...f_l_o_c_i].each_with_index do
293
- break _2 if _1 =~ /^\*\*#{@sub_category}\*\*/
294
- end
295
-
296
- if !sub_cat_i.is_a?(Integer)
297
- # the sub category not exists
298
-
299
- sub_cat_i = 2 + find_main_category_last_list_item_index(lns,main_cat_i,f_l_o_c_i)
300
- to_wr = lns[0...sub_cat_i].join + "**#{@sub_category}**\n\n" + ' - ' + log + "\n\n"
301
- File.write(@changelog, to_wr + lns[sub_cat_i..].join)
302
- else
303
- # the sub category exists
304
-
305
- sub_cat_i += main_cat_i+2
306
- to_wr = lns[0..sub_cat_i+1].join + ' - ' + log + "\n"
307
- File.write(@changelog, to_wr + lns[sub_cat_i+2..].join)
308
- end
309
-
310
- puts "chlog: Add log to #{category}/#{@sub_category}"
311
- return
312
- end # end of if @sub_category
313
- ########################################
314
-
315
-
316
-
317
- # situation: no sub category
318
-
319
- to_wr = lns[0..main_cat_i+1].join + '- ' + log + "\n"
320
-
321
- # main category list should be separated with
322
- # sub category
323
- if lns[main_cat_i+2] =~ /\*\*.*/
324
- to_wr += "\n"
325
- end
326
- File.write(@changelog, to_wr + lns[main_cat_i+2..].join)
327
- end
328
-
329
- puts "chlog: Add log to #{category}"
330
- end
331
-
332
-
333
-
334
- # main category order: 1
335
- def add_to_new_features
336
- meta_add_to_a_category(@log, 1, "New features")
337
- end
338
-
339
- # main category order: 2
340
- def add_to_enhancements
341
- meta_add_to_a_category(@log, 2, "Enhancements")
342
- end
343
-
344
- # main_category_order: 3
345
- def add_to_bug_fixes
346
- meta_add_to_a_category(@log, 3, "Bug fixes")
347
- end
348
-
349
- # main_category_order: 4
350
- def add_to_security
351
- meta_add_to_a_category(@log, 4, "Security")
352
- end
353
-
354
- # main_category_order: 5
355
- def add_to_compatibility
356
- meta_add_to_a_category(@log, 5, "Compatibility")
357
- end
358
-
359
- # The last of order table
360
- # main_category_order: 6
361
- def add_to_deprecations
362
- meta_add_to_a_category(@log, 6, "Deprecations")
363
- end
364
-
365
- # Release a version
366
- def release_new_version(ver)
367
- if ver.nil?
368
- puts "chlog: No version supplied!"; puts; abort "Use chlog -r <version>!"
369
- end
370
-
371
- if !ver.downcase.start_with?('v') and ver[0].match? /\d/
372
- ver = 'v' + ver
373
- end
374
-
375
- content = get_changelog
376
- lns = content.lines
377
-
378
- match_unreleased_fail!(lns[2])
379
-
380
- header = <<~EOF
381
- # Changelog
382
-
383
- ## [Unreleased](#) (#{TODAY})
384
-
385
- <br>
386
-
387
- EOF
388
-
389
- new_version = "## [#{ver}](#) (#{TODAY})\n"
390
- new_cont = header + new_version + lns[3..].join('')
391
- File.write(@changelog, new_cont)
392
- puts "chlog: Release #{ver} in Changelog!" or return true
393
- end
394
-
395
-
396
- # Help user interactively
397
- def ask_user_category
398
- category = @highline.choose do |menu|
399
- menu.index_color = :rgb_77bbff
400
- menu.prompt = "What main category?"
401
- # return number!!! not string!!!
402
- menu.choices(*LIST__Main_Category)
403
- end
404
-
405
- option = LIST__Main_Category.index(category)
406
-
407
- if @sub_category.nil?
408
- sub = @highline.ask "What sub category? [NIL/sub]"
409
- case sub
410
- when '' then @sub_category = nil
411
- else @sub_category = sub end
412
- end
413
- return option
414
- end
415
-
416
- end
417
-
418
- #############
419
- # main
420
- #############
421
- Chlog::CliHandler.new $*
422
- exit(true)