releasehx 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/README.adoc +4 -2
- data/build/docs/_config.yml +17 -1
- data/build/docs/_release_index.adoc +9 -0
- data/build/docs/config-reference.adoc +6 -6
- data/build/docs/config-reference.json +4 -3
- data/build/docs/index.adoc +3 -2
- data/build/docs/landing.adoc +10 -3
- data/build/docs/releases.adoc +28 -0
- data/build/docs/sample-config.adoc +2 -0
- data/build/docs/sample-config.yml +2 -2
- data/lib/releasehx/cli.rb +16 -7
- data/lib/releasehx/generated.rb +1 -1
- data/lib/releasehx/mcp/assets/config-def.yml +4 -2
- data/lib/releasehx/mcp/assets/config-reference.adoc +6 -6
- data/lib/releasehx/mcp/assets/config-reference.json +4 -3
- data/lib/releasehx/mcp/assets/sample-config.yml +2 -2
- data/lib/releasehx/rhyml/adapter.rb +13 -6
- data/lib/releasehx/rhyml/mappings/github.yaml +3 -1
- data/lib/releasehx/rhyml/templates/entry.adoc.liquid +3 -7
- data/lib/releasehx/rhyml/templates/entry.md.liquid +3 -4
- data/lib/releasehx/rhyml/templates/metadata-entry.adoc.liquid +36 -47
- data/lib/releasehx/rhyml/templates/metadata-note.adoc.liquid +36 -47
- data/lib/releasehx/rhyml/templates/note.adoc.liquid +2 -40
- data/lib/releasehx/rhyml/templates/note.md.liquid +6 -10
- data/lib/releasehx/rhyml/templates/parts-listing.liquid +6 -6
- data/lib/releasehx/rhyml/templates/rhyml-change.yaml.liquid +2 -1
- data/lib/schemagraphy/regexp_utils.rb +21 -1
- data/specs/data/config-def.yml +4 -2
- metadata +3 -2
- data/build/docs/Gemfile.lock +0 -95
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b1a5f031876899a54910d8cf53694c15fc56f7ded648e2f30e0da4321bac0489
|
|
4
|
+
data.tar.gz: f2d8c4c2e09bb013844aa1915456c1d30dd7e6499ab546c86ade44ba34fce037
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3041a79a2f37e0277710ff11f66b46e2afb82a9c54e667719fc8f8ecb17a5f9902d43123d6fdadddb9aae39323d1d6c38e89f2544058460ae542382c3c8c2a6e
|
|
7
|
+
data.tar.gz: ede775257fe7a1661dc8f37b2a7f5211cb99400c6926e662fcb8b4f83abee82d83cff74ad2ccdd423a5a4079e84d26925786589e4777b8561229a73c8a6f6b21
|
data/README.adoc
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
:page-layout: default
|
|
2
|
-
:page-permalink: /docs
|
|
2
|
+
:page-permalink: /docs/
|
|
3
|
+
:page-title: ReleaseHx Docs
|
|
3
4
|
:page-nav_order: 1
|
|
4
5
|
[[releasehx]]
|
|
5
6
|
= ReleaseHx
|
|
@@ -15,7 +16,7 @@
|
|
|
15
16
|
:this_prod_vrsn_major: 0
|
|
16
17
|
:this_prod_vrsn_minor: 1
|
|
17
18
|
:this_prod_vrsn_major-minor: {this_prod_vrsn_major}.{this_prod_vrsn_minor}
|
|
18
|
-
:this_prod_vrsn_patch:
|
|
19
|
+
:this_prod_vrsn_patch: 2
|
|
19
20
|
:this_prod_vrsn: {this_prod_vrsn_major-minor}.{this_prod_vrsn_patch}
|
|
20
21
|
:next_prod_vrsn: 0.2.0
|
|
21
22
|
:tagline: Generate formatted release histories from Jira, GitHub, GitLab, YAML, or JSON sources.
|
|
@@ -2475,6 +2476,7 @@ Use `PORT=NNNN` environment argument to specify a different port.
|
|
|
2475
2476
|
[.prompt]
|
|
2476
2477
|
PORT=4000 bundle exec rake serve
|
|
2477
2478
|
|
|
2479
|
+
[[docopslab-devtool]]
|
|
2478
2480
|
==== DocOps Lab Devtool (`docopslab-dev`)
|
|
2479
2481
|
|
|
2480
2482
|
Special dev Rake tasks and libraries are available via the `docopslab-dev` gem.
|
data/build/docs/_config.yml
CHANGED
|
@@ -4,12 +4,24 @@ baseurl: /
|
|
|
4
4
|
|
|
5
5
|
plugins:
|
|
6
6
|
- jekyll-asciidoc
|
|
7
|
+
- jekyll-redirect-from
|
|
8
|
+
|
|
9
|
+
collections:
|
|
10
|
+
releases:
|
|
11
|
+
output: true
|
|
12
|
+
permalink: /docs/releases/:name/
|
|
7
13
|
|
|
8
14
|
defaults:
|
|
9
15
|
- scope:
|
|
10
|
-
path: "api"
|
|
16
|
+
path: "docs/api"
|
|
11
17
|
values:
|
|
12
18
|
render_with_liquid: false
|
|
19
|
+
- scope:
|
|
20
|
+
path: ""
|
|
21
|
+
type: "releases"
|
|
22
|
+
values:
|
|
23
|
+
layout: default
|
|
24
|
+
nav_exclude: true
|
|
13
25
|
|
|
14
26
|
include:
|
|
15
27
|
- index.adoc
|
|
@@ -17,6 +29,10 @@ include:
|
|
|
17
29
|
|
|
18
30
|
exclude:
|
|
19
31
|
- manpage.adoc
|
|
32
|
+
- jekyll/
|
|
33
|
+
- payloads/
|
|
34
|
+
- release/
|
|
35
|
+
- yard/
|
|
20
36
|
|
|
21
37
|
# Enable Rouge for syntax highlighting in AsciiDoc blocks
|
|
22
38
|
asciidoctor:
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
:page-permalink: /config-reference/
|
|
3
|
-
:page-nav_order: 2
|
|
4
|
-
:page-title: Configuration Reference
|
|
1
|
+
|
|
5
2
|
|
|
6
3
|
[[conf_ppty_DOLLARSIGN_meta,config.$meta]]
|
|
7
4
|
$meta::
|
|
@@ -359,6 +356,9 @@ Defaults to `issue_body` for GitHub and GitLab, but to `custom_field` for Jira.
|
|
|
359
356
|
|
|
360
357
|
[horizontal]
|
|
361
358
|
type;; String
|
|
359
|
+
default;;
|
|
360
|
+
+
|
|
361
|
+
`+++issue_body+++`
|
|
362
362
|
path;; `xref:conf_ppty_conversions_note[config.conversions.note]`
|
|
363
363
|
--
|
|
364
364
|
|
|
@@ -395,7 +395,7 @@ type;; RegExp
|
|
|
395
395
|
default;;
|
|
396
396
|
+
|
|
397
397
|
....
|
|
398
|
-
/^((#|=)+ (Draft )?Release Note
|
|
398
|
+
/^(((#|=)+ (Draft )?Release Note.*?)|(<!-- (draft )?release note -->))\n+(?<note>(.| )+)/gmi
|
|
399
399
|
....
|
|
400
400
|
path;; `xref:conf_ppty_conversions_note_pattern[config.conversions.note_pattern]`
|
|
401
401
|
--
|
|
@@ -3161,7 +3161,7 @@ This value will apply either when <<conf_ppty_rhyml_max_parts>> is set to `1` or
|
|
|
3161
3161
|
type;; String
|
|
3162
3162
|
default;;
|
|
3163
3163
|
+
|
|
3164
|
-
`+++
|
|
3164
|
+
`+++Component+++`
|
|
3165
3165
|
path;; `xref:conf_ppty_history_labeling_part_label[config.history.labeling.part_label]`
|
|
3166
3166
|
--
|
|
3167
3167
|
|
|
@@ -129,7 +129,8 @@
|
|
|
129
129
|
"note": {
|
|
130
130
|
"path": "conversions.note",
|
|
131
131
|
"desc": "The source of the release notes content.\nMust be `issue_body`, `custom_field`, or `commit_message`.\n\nDefaults to `issue_body` for GitHub and GitLab, but to `custom_field` for Jira.\n",
|
|
132
|
-
"type": "String"
|
|
132
|
+
"type": "String",
|
|
133
|
+
"default": "issue_body"
|
|
133
134
|
},
|
|
134
135
|
"note_custom_field": {
|
|
135
136
|
"path": "conversions.note_custom_field",
|
|
@@ -140,7 +141,7 @@
|
|
|
140
141
|
"path": "conversions.note_pattern",
|
|
141
142
|
"desc": "The Regular Expressions pattern to match in the body of an issue or commit message, after which all content is considered the release `note` matter.\n\nDefaults to a Markdown or AsciiDoc header or HTML comment with the case-insensitive string `release note` in it.\n\nUses Capture group `note` in the Regular Expression to establish the entire note content.\n\nSee the `conversions.head_pattern` property for details on extracting a heading (`head` in RHYML) from the `note` content.\n",
|
|
142
143
|
"type": "RegExp",
|
|
143
|
-
"default": "/^((#|=)+ (Draft )?Release Note
|
|
144
|
+
"default": "/^(((#|=)+ (Draft )?Release Note.*?)|(<!-- (draft )?release note -->))\\n+(?<note>(.| )+)/gmi"
|
|
144
145
|
},
|
|
145
146
|
"head_pattern": {
|
|
146
147
|
"path": "conversions.head_pattern",
|
|
@@ -1228,7 +1229,7 @@
|
|
|
1228
1229
|
"path": "history.labeling.part_label",
|
|
1229
1230
|
"desc": "The label to use for the _singular_ part/component affected by the change, when only one part is permitted.\n\nThis value will apply either when <<conf_ppty_rhyml_max_parts>> is set to `1` or when the change has only one part _and_ <<conf_ppty_history_labeling_singularize_labels>> is `true`.\n",
|
|
1230
1231
|
"type": "String",
|
|
1231
|
-
"default": "
|
|
1232
|
+
"default": "Component"
|
|
1232
1233
|
},
|
|
1233
1234
|
"parts_icon": {
|
|
1234
1235
|
"path": "history.labeling.parts_icon",
|
data/build/docs/index.adoc
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
:page-layout: default
|
|
2
|
-
:page-permalink: /docs
|
|
2
|
+
:page-permalink: /docs/
|
|
3
|
+
:page-title: ReleaseHx Docs
|
|
3
4
|
:page-nav_order: 1
|
|
4
5
|
[[releasehx]]
|
|
5
6
|
= ReleaseHx
|
|
@@ -15,7 +16,7 @@
|
|
|
15
16
|
:this_prod_vrsn_major: 0
|
|
16
17
|
:this_prod_vrsn_minor: 1
|
|
17
18
|
:this_prod_vrsn_major-minor: {this_prod_vrsn_major}.{this_prod_vrsn_minor}
|
|
18
|
-
:this_prod_vrsn_patch:
|
|
19
|
+
:this_prod_vrsn_patch: 2
|
|
19
20
|
:this_prod_vrsn: {this_prod_vrsn_major-minor}.{this_prod_vrsn_patch}
|
|
20
21
|
:next_prod_vrsn: 0.2.0
|
|
21
22
|
:tagline: Generate formatted release histories from Jira, GitHub, GitLab, YAML, or JSON sources.
|
data/build/docs/landing.adoc
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
:page-permalink: /
|
|
2
2
|
:page-layout: minimal
|
|
3
3
|
:page-liquid: true
|
|
4
|
+
:page-nav_exclude: true
|
|
4
5
|
= ReleaseHx
|
|
5
6
|
|
|
6
7
|
++++
|
|
@@ -10,9 +11,15 @@
|
|
|
10
11
|
<h1 class="title">
|
|
11
12
|
ReleaseHx
|
|
12
13
|
</h1>
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
<nav class="top-nav">
|
|
15
|
+
<a href="/docs/" class="button is-primary is-medium">
|
|
16
|
+
Documentation
|
|
17
|
+
</a>
|
|
18
|
+
|
|
|
19
|
+
<a href="/docs/releases/" class="button is-link is-medium">
|
|
20
|
+
Releases
|
|
21
|
+
</a>
|
|
22
|
+
</nav>
|
|
16
23
|
</div>
|
|
17
24
|
</div>
|
|
18
25
|
</div>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: default
|
|
3
|
+
title: Releases
|
|
4
|
+
nav_order: 90
|
|
5
|
+
permalink: /docs/releases/
|
|
6
|
+
---
|
|
7
|
+
= Release History
|
|
8
|
+
:page-layout: default
|
|
9
|
+
:page-title: Releases
|
|
10
|
+
:page-nav_order: 90
|
|
11
|
+
:page-permalink: /docs/releases/
|
|
12
|
+
|
|
13
|
+
Complete release history for ReleaseHx, generated using ReleaseHx itself.
|
|
14
|
+
|
|
15
|
+
ifdef::env-site[]
|
|
16
|
+
// Generated during prebuild - includes release index and content
|
|
17
|
+
include::_release_index.adoc[]
|
|
18
|
+
endif::[]
|
|
19
|
+
|
|
20
|
+
ifndef::env-site[]
|
|
21
|
+
== Development Mode
|
|
22
|
+
|
|
23
|
+
Release history is generated during the prebuild process. Run `bundle exec rake prebuild` to generate the full release index.
|
|
24
|
+
endif::[]
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
For more information about ReleaseHx, see the link:/docs/[main documentation].
|
|
@@ -22,7 +22,7 @@ origin: # The API or file source for the issues.
|
|
|
22
22
|
conversions: # Details about content origination, as well as markup sources and conversion.
|
|
23
23
|
summ: issue # The source of the summary (Changelog) content.
|
|
24
24
|
# head: # The source of release-note headlines, when it is not the same as the summary.
|
|
25
|
-
|
|
25
|
+
note: issue_body # The source of the release notes content.
|
|
26
26
|
# note_custom_field: # The name of the custom field to use for the release notes content.Liquid error: wrong number of arguments (given 3, expected 1..2)Liquid error: wrong number of arguments (given 3, expected 1..2)
|
|
27
27
|
markup: markdown # The origin markup format for notes.
|
|
28
28
|
# engine: # The markup converter to use for the issues.
|
|
@@ -195,7 +195,7 @@ history: # Configurations for the overall document, when applicable.Liquid error
|
|
|
195
195
|
type_label: type # The label to use for the type of change.
|
|
196
196
|
# type_icon: # The icon to use for the type of change.
|
|
197
197
|
parts_label: Components # The label to use for the part/component affected by the change.
|
|
198
|
-
part_label:
|
|
198
|
+
part_label: Component # The label to use for the singular part/component affected by the change, when only one part is permitted.
|
|
199
199
|
parts_icon: puzzle-piece # The icon to use for the part/component affected by the change.
|
|
200
200
|
tags_label: # The tags associated with the change, if any.
|
|
201
201
|
- Tags
|
data/lib/releasehx/cli.rb
CHANGED
|
@@ -688,23 +688,32 @@ module ReleaseHx
|
|
|
688
688
|
end
|
|
689
689
|
|
|
690
690
|
def create_rhyml_from_source source_path, version
|
|
691
|
-
#
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
# Handle different source types based on configuration
|
|
695
|
-
case configured_source_type
|
|
696
|
-
when 'rhyml'
|
|
691
|
+
# First check if source_path is actually a file (overrides config)
|
|
692
|
+
if version_or_file(source_path) == :file && File.exist?(source_path)
|
|
697
693
|
# Load RHYML data directly from YAML file
|
|
694
|
+
ReleaseHx.logger.debug "Loading RHYML from file: #{source_path}" if options[:verbose]
|
|
698
695
|
rhyml_data = SchemaGraphy::Loader.load_yaml_with_tags(source_path)
|
|
699
696
|
release_data = rhyml_data['releases'] ? rhyml_data['releases'].first : rhyml_data
|
|
700
697
|
|
|
701
698
|
# Convert hash keys to keyword arguments for Release constructor
|
|
702
|
-
ReleaseHx::RHYML::Release.new(
|
|
699
|
+
return ReleaseHx::RHYML::Release.new(
|
|
703
700
|
code: release_data['code'] || version,
|
|
704
701
|
date: release_data['date'],
|
|
705
702
|
hash: release_data['hash'],
|
|
706
703
|
memo: release_data['memo'],
|
|
707
704
|
changes: release_data['changes'] || [])
|
|
705
|
+
end
|
|
706
|
+
|
|
707
|
+
# Determine source type from configuration
|
|
708
|
+
configured_source_type = @settings.dig('origin', 'source') || 'json'
|
|
709
|
+
|
|
710
|
+
# Handle different source types based on configuration
|
|
711
|
+
case configured_source_type
|
|
712
|
+
when 'rhyml'
|
|
713
|
+
# Config says rhyml but source_path is not a file - error
|
|
714
|
+
raise Thor::Error,
|
|
715
|
+
"ERROR: origin.source is 'rhyml' but no YAML file provided. " \
|
|
716
|
+
'Specify a YAML file path as the first argument.'
|
|
708
717
|
when 'json'
|
|
709
718
|
# For json type, only use local files (never API calls)
|
|
710
719
|
if options[:api_data]
|
data/lib/releasehx/generated.rb
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Auto-generated by Sourcerer::Builder
|
|
3
3
|
|
|
4
4
|
module ReleaseHx
|
|
5
|
-
ATTRIBUTES = {:globals=>{"attribute-undefined"=>"drop-line", "attribute-missing"=>"skip", "appendix-caption"=>"Appendix", "appendix-refsig"=>"Appendix", "caution-caption"=>"Caution", "chapter-refsig"=>"Chapter", "example-caption"=>"Example", "figure-caption"=>"Figure", "important-caption"=>"Important", "last-update-label"=>"Last updated", "note-caption"=>"Note", "part-refsig"=>"Part", "prewrap"=>"", "sectids"=>"", "section-refsig"=>"Section", "table-caption"=>"Table", "tip-caption"=>"Tip", "toc-placement"=>"macro", "toc-title"=>"Table of Contents", "untitled-label"=>"Untitled", "version-label"=>"Version", "warning-caption"=>"Warning", "notitle"=>"", "docfile"=>"/home/brian/Documents/work/releasehx/README.adoc", "docdir"=>"/home/brian/Documents/work/releasehx", "docfilesuffix"=>".adoc", "docname"=>"README", "embedded"=>"", "asciidoctor"=>"", "asciidoctor-version"=>"2.0.23", "safe-mode-name"=>"unsafe", "safe-mode-unsafe"=>"", "safe-mode-level"=>0, "max-include-depth"=>64, "user-home"=>"/home/brian", "doctype"=>"article", "htmlsyntax"=>"html", "backend-html5-doctype-article"=>"", "doctype-article"=>"", "backend-html5"=>"", "backend"=>"html5", "outfilesuffix"=>".html", "filetype"=>"html", "filetype-html"=>"", "basebackend-html-doctype-article"=>"", "basebackend-html"=>"", "basebackend"=>"html", "stylesdir"=>".", "iconsdir"=>"./images/icons", "localdate"=>"2026-01-
|
|
5
|
+
ATTRIBUTES = {:globals=>{"attribute-undefined"=>"drop-line", "attribute-missing"=>"skip", "appendix-caption"=>"Appendix", "appendix-refsig"=>"Appendix", "caution-caption"=>"Caution", "chapter-refsig"=>"Chapter", "example-caption"=>"Example", "figure-caption"=>"Figure", "important-caption"=>"Important", "last-update-label"=>"Last updated", "note-caption"=>"Note", "part-refsig"=>"Part", "prewrap"=>"", "sectids"=>"", "section-refsig"=>"Section", "table-caption"=>"Table", "tip-caption"=>"Tip", "toc-placement"=>"macro", "toc-title"=>"Table of Contents", "untitled-label"=>"Untitled", "version-label"=>"Version", "warning-caption"=>"Warning", "notitle"=>"", "docfile"=>"/home/brian/Documents/work/releasehx/README.adoc", "docdir"=>"/home/brian/Documents/work/releasehx", "docfilesuffix"=>".adoc", "docname"=>"README", "embedded"=>"", "asciidoctor"=>"", "asciidoctor-version"=>"2.0.23", "safe-mode-name"=>"unsafe", "safe-mode-unsafe"=>"", "safe-mode-level"=>0, "max-include-depth"=>64, "user-home"=>"/home/brian", "doctype"=>"article", "htmlsyntax"=>"html", "backend-html5-doctype-article"=>"", "doctype-article"=>"", "backend-html5"=>"", "backend"=>"html5", "outfilesuffix"=>".html", "filetype"=>"html", "filetype-html"=>"", "basebackend-html-doctype-article"=>"", "basebackend-html"=>"", "basebackend"=>"html", "stylesdir"=>".", "iconsdir"=>"./images/icons", "localdate"=>"2026-01-30", "localyear"=>"2026", "localtime"=>"01:33:36 -0500", "localdatetime"=>"2026-01-30 01:33:36 -0500", "docdate"=>"2026-01-30", "docyear"=>"2026", "doctime"=>"00:47:36 -0500", "docdatetime"=>"2026-01-30 00:47:36 -0500", "page-layout"=>"default", "page-permalink"=>"/docs/", "page-title"=>"ReleaseHx Docs", "page-nav_order"=>"1", "doctitle"=>"ReleaseHx", "docopslab_git_www"=>"https://github.com/DocOps", "this_prod_slug"=>"releasehx", "releasehx_prod_repo"=>"https://github.com/DocOps/releasehx", "releasehx_demo_repo"=>"https://github.com/DocOps/releasehx-demo", "this_prod_repo"=>"https://github.com/DocOps/releasehx", "this_prod_vrsn_major"=>"0", "this_prod_vrsn_minor"=>"1", "this_prod_vrsn_major-minor"=>"0.1", "this_prod_vrsn_patch"=>"2", "this_prod_vrsn"=>"0.1.2", "next_prod_vrsn"=>"0.2.0", "tagline"=>"Generate formatted release histories from Jira, GitHub, GitLab, YAML, or JSON sources.", "description"=>"CLI utility and Ruby API for generating structured release notes and changelog documents from various issue-tracking platforms or YAML definitions into plaintext drafts (<strong>AsciiDoc</strong>, <strong>Markdown</strong>, <strong>YAML</strong>) and rich-text output (<strong>HTML</strong> and <strong>PDF</strong>).", "gem_config_definition_path"=>"./specs/data/config-def.yml", "app_default_config_path"=>"./.releasehx.yml", "default_markup"=>"markdown", "default_slug_type"=>"kebab", "default_tplt_lang"=>"liquid", "default_drafts_dir"=>"_drafts", "default_enrich_dir"=>"_publish", "default_output_dir"=>".", "default_payloads_dir"=>"_payloads", "default_templates_dir"=>"_templates", "default_mappings_dir"=>"_mappings", "default_api_clients_dir"=>"_apis", "default_cache_dir"=>".releasehx/cache", "default_api_cred_env"=>"RELEASEHX_API_CRED", "default_api_key_env"=>"RELEASEHX_API_KEY", "default_api_user_env"=>"RELEASEHX_API_USER", "default_api_org_env"=>"RELEASEHX_API_ORG", "markdown_extensions"=>".md, .markdown", "asciidoc_extensions"=>".adoc, .ad, .asciidoc", "yaml_extensions"=>".yml, .yaml, .rhyml", "draft_source_file_types"=>"AsciiDoc, Markdown, YAML", "draft_source_extensions"=>".md, .markdown, .adoc, .ad, .asciidoc, .yml, .yaml, .rhyml", "enrich_file_types"=>"HTML, PDF", "enrich_extensions"=>".html, .pdf", "docker_base_command"=>"docker run -it --rm --user $(id -u):$(id -g) -v $(pwd):/workdir docopslab/releasehx rhx", "this_prod_repo_branch"=>"https://github.com/DocOps/releasehx/tree/release/0.1", "docs_extn"=>"", "toc"=>"", "toclevels"=>"3", "authorcount"=>0, "toc-position"=>"content"}}
|
|
6
6
|
|
|
7
7
|
SNIPPET_LOOKUP = {"helpscreen"=>"helpscreen.txt"}
|
|
8
8
|
|
|
@@ -165,6 +165,7 @@ properties:
|
|
|
165
165
|
Must be `issue_body`, `custom_field`, or `commit_message`.
|
|
166
166
|
|
|
167
167
|
Defaults to `issue_body` for GitHub and GitLab, but to `custom_field` for Jira.
|
|
168
|
+
dflt: issue_body
|
|
168
169
|
note_custom_field:
|
|
169
170
|
type: String
|
|
170
171
|
desc: |
|
|
@@ -182,7 +183,8 @@ properties:
|
|
|
182
183
|
Uses Capture group `note` in the Regular Expression to establish the entire note content.
|
|
183
184
|
|
|
184
185
|
See the `conversions.head_pattern` property for details on extracting a heading (`head` in RHYML) from the `note` content.
|
|
185
|
-
dflt: '/^((#|=)+ (Draft )?Release Note
|
|
186
|
+
dflt: '/^(((#|=)+ (Draft )?Release Note.*?)|(<!-- (draft )?release note -->))\n+(?<note>(.|
|
|
187
|
+
)+)/gmi'
|
|
186
188
|
head_pattern:
|
|
187
189
|
type: RegExp
|
|
188
190
|
desc: |
|
|
@@ -1162,7 +1164,7 @@ properties:
|
|
|
1162
1164
|
The label to use for the _singular_ part/component affected by the change, when only one part is permitted.
|
|
1163
1165
|
|
|
1164
1166
|
This value will apply either when <<conf_ppty_rhyml_max_parts>> is set to `1` or when the change has only one part _and_ <<conf_ppty_history_labeling_singularize_labels>> is `true`.
|
|
1165
|
-
dflt:
|
|
1167
|
+
dflt: Component
|
|
1166
1168
|
parts_icon:
|
|
1167
1169
|
type: String
|
|
1168
1170
|
desc: |
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
:page-permalink: /config-reference/
|
|
3
|
-
:page-nav_order: 2
|
|
4
|
-
:page-title: Configuration Reference
|
|
1
|
+
|
|
5
2
|
|
|
6
3
|
[[conf_ppty_DOLLARSIGN_meta,config.$meta]]
|
|
7
4
|
$meta::
|
|
@@ -359,6 +356,9 @@ Defaults to `issue_body` for GitHub and GitLab, but to `custom_field` for Jira.
|
|
|
359
356
|
|
|
360
357
|
[horizontal]
|
|
361
358
|
type;; String
|
|
359
|
+
default;;
|
|
360
|
+
+
|
|
361
|
+
`+++issue_body+++`
|
|
362
362
|
path;; `xref:conf_ppty_conversions_note[config.conversions.note]`
|
|
363
363
|
--
|
|
364
364
|
|
|
@@ -395,7 +395,7 @@ type;; RegExp
|
|
|
395
395
|
default;;
|
|
396
396
|
+
|
|
397
397
|
....
|
|
398
|
-
/^((#|=)+ (Draft )?Release Note
|
|
398
|
+
/^(((#|=)+ (Draft )?Release Note.*?)|(<!-- (draft )?release note -->))\n+(?<note>(.| )+)/gmi
|
|
399
399
|
....
|
|
400
400
|
path;; `xref:conf_ppty_conversions_note_pattern[config.conversions.note_pattern]`
|
|
401
401
|
--
|
|
@@ -3161,7 +3161,7 @@ This value will apply either when <<conf_ppty_rhyml_max_parts>> is set to `1` or
|
|
|
3161
3161
|
type;; String
|
|
3162
3162
|
default;;
|
|
3163
3163
|
+
|
|
3164
|
-
`+++
|
|
3164
|
+
`+++Component+++`
|
|
3165
3165
|
path;; `xref:conf_ppty_history_labeling_part_label[config.history.labeling.part_label]`
|
|
3166
3166
|
--
|
|
3167
3167
|
|
|
@@ -129,7 +129,8 @@
|
|
|
129
129
|
"note": {
|
|
130
130
|
"path": "conversions.note",
|
|
131
131
|
"desc": "The source of the release notes content.\nMust be `issue_body`, `custom_field`, or `commit_message`.\n\nDefaults to `issue_body` for GitHub and GitLab, but to `custom_field` for Jira.\n",
|
|
132
|
-
"type": "String"
|
|
132
|
+
"type": "String",
|
|
133
|
+
"default": "issue_body"
|
|
133
134
|
},
|
|
134
135
|
"note_custom_field": {
|
|
135
136
|
"path": "conversions.note_custom_field",
|
|
@@ -140,7 +141,7 @@
|
|
|
140
141
|
"path": "conversions.note_pattern",
|
|
141
142
|
"desc": "The Regular Expressions pattern to match in the body of an issue or commit message, after which all content is considered the release `note` matter.\n\nDefaults to a Markdown or AsciiDoc header or HTML comment with the case-insensitive string `release note` in it.\n\nUses Capture group `note` in the Regular Expression to establish the entire note content.\n\nSee the `conversions.head_pattern` property for details on extracting a heading (`head` in RHYML) from the `note` content.\n",
|
|
142
143
|
"type": "RegExp",
|
|
143
|
-
"default": "/^((#|=)+ (Draft )?Release Note
|
|
144
|
+
"default": "/^(((#|=)+ (Draft )?Release Note.*?)|(<!-- (draft )?release note -->))\\n+(?<note>(.| )+)/gmi"
|
|
144
145
|
},
|
|
145
146
|
"head_pattern": {
|
|
146
147
|
"path": "conversions.head_pattern",
|
|
@@ -1228,7 +1229,7 @@
|
|
|
1228
1229
|
"path": "history.labeling.part_label",
|
|
1229
1230
|
"desc": "The label to use for the _singular_ part/component affected by the change, when only one part is permitted.\n\nThis value will apply either when <<conf_ppty_rhyml_max_parts>> is set to `1` or when the change has only one part _and_ <<conf_ppty_history_labeling_singularize_labels>> is `true`.\n",
|
|
1230
1231
|
"type": "String",
|
|
1231
|
-
"default": "
|
|
1232
|
+
"default": "Component"
|
|
1232
1233
|
},
|
|
1233
1234
|
"parts_icon": {
|
|
1234
1235
|
"path": "history.labeling.parts_icon",
|
|
@@ -22,7 +22,7 @@ origin: # The API or file source for the issues.
|
|
|
22
22
|
conversions: # Details about content origination, as well as markup sources and conversion.
|
|
23
23
|
summ: issue # The source of the summary (Changelog) content.
|
|
24
24
|
# head: # The source of release-note headlines, when it is not the same as the summary.
|
|
25
|
-
|
|
25
|
+
note: issue_body # The source of the release notes content.
|
|
26
26
|
# note_custom_field: # The name of the custom field to use for the release notes content.Liquid error: wrong number of arguments (given 3, expected 1..2)Liquid error: wrong number of arguments (given 3, expected 1..2)
|
|
27
27
|
markup: markdown # The origin markup format for notes.
|
|
28
28
|
# engine: # The markup converter to use for the issues.
|
|
@@ -195,7 +195,7 @@ history: # Configurations for the overall document, when applicable.Liquid error
|
|
|
195
195
|
type_label: type # The label to use for the type of change.
|
|
196
196
|
# type_icon: # The icon to use for the type of change.
|
|
197
197
|
parts_label: Components # The label to use for the part/component affected by the change.
|
|
198
|
-
part_label:
|
|
198
|
+
part_label: Component # The label to use for the singular part/component affected by the change, when only one part is permitted.
|
|
199
199
|
parts_icon: puzzle-piece # The icon to use for the part/component affected by the change.
|
|
200
200
|
tags_label: # The tags associated with the change, if any.
|
|
201
201
|
- Tags
|
|
@@ -349,7 +349,7 @@ module ReleaseHx
|
|
|
349
349
|
note_pattern = sources['note_pattern'] || templates['note_pattern']
|
|
350
350
|
head_pattern = sources['head_pattern'] || templates['head_pattern']
|
|
351
351
|
head_source = sources['head_source']
|
|
352
|
-
note_source = sources['
|
|
352
|
+
note_source = sources['note']
|
|
353
353
|
|
|
354
354
|
extract_note!(data, note_source, note_pattern)
|
|
355
355
|
extract_head!(data, head_source, head_pattern)
|
|
@@ -406,10 +406,10 @@ module ReleaseHx
|
|
|
406
406
|
end
|
|
407
407
|
|
|
408
408
|
# STEP 2: Apply regex pattern extraction if configured
|
|
409
|
-
return unless note_source
|
|
409
|
+
return unless note_source == 'issue_body' && original_content.is_a?(String) && note_pattern
|
|
410
410
|
|
|
411
411
|
ReleaseHx.logger.debug "Extracting note using pattern: #{note_pattern}"
|
|
412
|
-
ReleaseHx.logger.debug "Original content: #{original_content}"
|
|
412
|
+
ReleaseHx.logger.debug "Original content: #{original_content[0..100]}..."
|
|
413
413
|
|
|
414
414
|
begin
|
|
415
415
|
# Apply sensible default flag 'm' (multiline/dotall in Ruby) when no flags provided
|
|
@@ -421,11 +421,18 @@ module ReleaseHx
|
|
|
421
421
|
pattern_info,
|
|
422
422
|
'note')
|
|
423
423
|
|
|
424
|
-
|
|
425
|
-
|
|
424
|
+
if extracted_note
|
|
425
|
+
# Pattern matched - use extracted content
|
|
426
|
+
data['note'] = extracted_note.strip
|
|
427
|
+
ReleaseHx.logger.debug "Extracted note (#{extracted_note.length} chars)"
|
|
428
|
+
else
|
|
429
|
+
# Pattern didn't match - clear the note so empty_notes policy applies
|
|
430
|
+
ReleaseHx.logger.warn "Note pattern did not match for issue #{data['tick']} - no Release Note section found"
|
|
431
|
+
data['note'] = nil
|
|
432
|
+
end
|
|
426
433
|
rescue RegexpError => e
|
|
427
434
|
ReleaseHx.logger.warn "Invalid note_pattern '#{note_pattern}': #{e.message}"
|
|
428
|
-
|
|
435
|
+
# Preserve original content on pattern error - don't lose data due to bad config
|
|
429
436
|
end
|
|
430
437
|
end
|
|
431
438
|
|
|
@@ -25,7 +25,9 @@ note:
|
|
|
25
25
|
|
|
26
26
|
# Extract type from the native GitHub Issues type field (modern approach)
|
|
27
27
|
type:
|
|
28
|
-
path: "
|
|
28
|
+
path: "type.name"
|
|
29
|
+
ruby: |
|
|
30
|
+
path&.downcase
|
|
29
31
|
|
|
30
32
|
# Derive `parts` from labels using direct key matching or slug override
|
|
31
33
|
parts:
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
{%- embed metadata-entry.adoc.liquid -%}
|
|
2
1
|
{%- assign frame = content_config.items.frame %}
|
|
3
2
|
{%- assign summ = change.summ %}
|
|
4
3
|
{%- case frame %}
|
|
@@ -17,10 +16,7 @@
|
|
|
17
16
|
[start={{ item_count }}]
|
|
18
17
|
{%- endif %}
|
|
19
18
|
{{ bullet -}}
|
|
20
|
-
{{ change.summ | trim }}
|
|
21
|
-
{%- if
|
|
22
|
-
{{
|
|
23
|
-
{%- endif %}
|
|
24
|
-
{%- if change.note %}
|
|
25
|
-
xref:note-{{ change.chid }}[icon:sticky-note[]NOTE]
|
|
19
|
+
{{ change.summ | trim }}
|
|
20
|
+
{%- if change.note %} +
|
|
21
|
+
xref:note-{{ change.chid }}[NOTE]
|
|
26
22
|
{%- endif %}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
{%- embed metadata-entry.md.liquid -%}
|
|
2
1
|
{%- assign frame = content_config.items.frame | default: "unordered" %}
|
|
3
2
|
{%- assign summ = change.summ %}
|
|
4
3
|
{%- case frame %}
|
|
@@ -14,12 +13,12 @@
|
|
|
14
13
|
|
|
15
14
|
{%- if frame == "basic" %}
|
|
16
15
|
|
|
17
|
-
{{ bullet }}{{ change.summ | trim }}{% if
|
|
16
|
+
{{ bullet }}{{ change.summ | trim }}{% if change.note and change.note != "" %} [NOTE](#note-{{ change.chid }}){% endif %}
|
|
18
17
|
{%- elsif frame == "paragraph" %}
|
|
19
18
|
|
|
20
|
-
{{ change.summ | trim }}{% if
|
|
19
|
+
{{ change.summ | trim }}{% if change.note and change.note != "" %} [NOTE](#note-{{ change.chid }}){% endif %}
|
|
21
20
|
{%- else %}
|
|
22
21
|
|
|
23
|
-
{{ bullet }}{{ change.summ | trim }}{% if
|
|
22
|
+
{{ bullet }}{{ change.summ | trim }}{% if change.note and change.note != "" %} [NOTE](#note-{{ change.chid }}){% endif %}
|
|
24
23
|
{%- endif %}
|
|
25
24
|
|
|
@@ -4,53 +4,42 @@
|
|
|
4
4
|
{%- assign format = "asciidoc" %}
|
|
5
5
|
{%- embed tags-listing.liquid %}
|
|
6
6
|
{%- embed parts-listing.liquid %}
|
|
7
|
-
{%- capture change_metadata
|
|
8
|
-
{%- if parts_listing != "" and entry_show_parts_label
|
|
9
|
-
{{
|
|
10
|
-
{%-
|
|
11
|
-
{%- for part in change.parts
|
|
12
|
-
{%- unless part == "changelog" or part == "release_note_needed"
|
|
13
|
-
{{ config.parts[part]['text'] | default: part }}
|
|
14
|
-
{%-
|
|
15
|
-
{%- endfor %}
|
|
16
|
-
{%- endif %}
|
|
17
|
-
{%- if change.type %}
|
|
18
|
-
{%- assign type_config = config.types[change.type] %}
|
|
19
|
-
{%- if entry_show_type_label %}
|
|
20
|
-
[.meta-label.type-label]*{{ labeling_type_label }}:*
|
|
21
|
-
{%- endif %}
|
|
22
|
-
{%- if type_config.icon and show_icons and show_icons == "before" %}
|
|
23
|
-
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]
|
|
24
|
-
{%- endif %}
|
|
25
|
-
{{ type_config.text | default: change.type }}
|
|
26
|
-
{%- if type_config.icon and show_icons and show_icons == "after" %}
|
|
27
|
-
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]
|
|
28
|
-
{%- endif %}
|
|
29
|
-
{%- endif %}
|
|
30
|
-
{%- if tags_listing != "" and entry_show_tags_label %}
|
|
31
|
-
{{- tags_listing | trim }}
|
|
32
|
-
{%- elsif change.tags and change.tags.size > 0 and entry_show_tags_label == false %}
|
|
33
|
-
{%- for tag in change.tags %}
|
|
34
|
-
{%- unless tag == "changelog" or tag == "release_note_needed" %}
|
|
35
|
-
{{ config.tags[tag]['text'] | default: tag }}
|
|
36
|
-
{%- endunless %}
|
|
37
|
-
{%- endfor %}
|
|
38
|
-
{%- endif %}
|
|
39
|
-
{%- if entry_show_lead and change.lead %}
|
|
40
|
-
{%- if entry_show_lead_label %}
|
|
41
|
-
[.meta-label.lead-label]*{{ labeling_lead_label }}:*
|
|
42
|
-
{%- endif %}
|
|
43
|
-
{%- if entry_user_link_template %}
|
|
44
|
-
link:{{ entry_user_link_template | render: change }}[icon:user[]{{ change.lead }}]
|
|
45
|
-
{%- else %}
|
|
46
|
-
icon:user[]{{ change.lead }}
|
|
47
|
-
{%- endif %}
|
|
48
|
-
{%- endif %}
|
|
49
|
-
{%- if config.links.web.href and config.links.web.href != "" %}
|
|
50
|
-
link:{{ config.links.web.href | render: change }}[icon:{{ config.links.web.icon }}[]{{ config.links.web.text | render: change }}]
|
|
7
|
+
{%- capture change_metadata -%}
|
|
8
|
+
{%- if parts_listing != "" and entry_show_parts_label -%}
|
|
9
|
+
{{ parts_listing | trim }} {% endif -%}
|
|
10
|
+
{%- if change.parts and change.parts.size > 0 and entry_show_parts_label == false -%}
|
|
11
|
+
{%- for part in change.parts -%}
|
|
12
|
+
{%- unless part == "changelog" or part == "release_note_needed" -%}
|
|
13
|
+
{{ config.parts[part]['text'] | default: part }} {% endunless -%}
|
|
14
|
+
{%- endfor -%}
|
|
51
15
|
{%- endif -%}
|
|
52
|
-
{%- if
|
|
53
|
-
|
|
54
|
-
{%-
|
|
16
|
+
{%- if change.type -%}
|
|
17
|
+
{%- assign type_config = config.types[change.type] -%}
|
|
18
|
+
{%- if entry_show_type_label -%}
|
|
19
|
+
**{{ labeling_type_label }}:** {% endif -%}
|
|
20
|
+
{%- if type_config.icon and show_icons and show_icons == "before" -%}
|
|
21
|
+
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]{% endif -%}
|
|
22
|
+
{{ type_config.text | default: change.type }} {% if type_config.icon and show_icons and show_icons == "after" -%}
|
|
23
|
+
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]{% endif -%}
|
|
24
|
+
{%- endif -%}
|
|
25
|
+
{%- if tags_listing != "" and entry_show_tags_label -%}
|
|
26
|
+
{{ tags_listing | trim }} {% endif -%}
|
|
27
|
+
{%- if change.tags and change.tags.size > 0 and entry_show_tags_label == false -%}
|
|
28
|
+
{%- for tag in change.tags -%}
|
|
29
|
+
{%- unless tag == "changelog" or tag == "release_note_needed" -%}
|
|
30
|
+
{{ config.tags[tag]['text'] | default: tag }} {% endunless -%}
|
|
31
|
+
{%- endfor -%}
|
|
32
|
+
{%- endif -%}
|
|
33
|
+
{%- if entry_show_lead and change.lead -%}
|
|
34
|
+
{%- if entry_show_lead_label -%}
|
|
35
|
+
**{{ labeling_lead_label }}:** {% endif -%}
|
|
36
|
+
{%- if entry_user_link_template -%}
|
|
37
|
+
link:{{ entry_user_link_template | render: change }}[icon:user[]{{ change.lead }}] {% else -%}
|
|
38
|
+
icon:user[]{{ change.lead }} {% endif -%}
|
|
39
|
+
{%- endif -%}
|
|
40
|
+
{%- if config.links.web.href and config.links.web.href != "" -%}
|
|
41
|
+
link:{{ config.links.web.href | render: change }}[icon:{{ config.links.web.icon }}[]{{ config.links.web.text | render: change }}] {% endif -%}
|
|
42
|
+
{%- if entry_show_git_links and config.links.git.href and config.links.git.href != "" -%}
|
|
43
|
+
link:{{ config.links.git.href | render: change }}[icon:{{ config.links.git.icon | default: 'code-fork' }}[]{{ change.hash | slice: 0, 7 }}] {% endif -%}
|
|
55
44
|
{%- endcapture %}
|
|
56
45
|
{%- assign catch_metadata_error = change_metadata %}
|
|
@@ -4,53 +4,42 @@
|
|
|
4
4
|
{%- assign format = "asciidoc" %}
|
|
5
5
|
{%- embed tags-listing.liquid %}
|
|
6
6
|
{%- embed parts-listing.liquid %}
|
|
7
|
-
{%- capture change_metadata
|
|
8
|
-
{%- if parts_listing != "" and note_show_parts_label
|
|
9
|
-
{{
|
|
10
|
-
{%-
|
|
11
|
-
{%- for part in change.parts
|
|
12
|
-
{%- unless part == "changelog" or part == "release_note_needed"
|
|
13
|
-
{{ config.parts[part]['text'] | default: part }}
|
|
14
|
-
{%-
|
|
15
|
-
{%- endfor %}
|
|
16
|
-
{%- endif %}
|
|
17
|
-
{%- if change.type %}
|
|
18
|
-
{%- assign type_config = config.types[change.type] %}
|
|
19
|
-
{%- if note_show_type_label %}
|
|
20
|
-
[.meta-label.type-label]*{{ labeling_type_label }}:*
|
|
21
|
-
{%- endif %}
|
|
22
|
-
{%- if type_config.icon and show_icons and show_icons == "before" %}
|
|
23
|
-
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]
|
|
24
|
-
{%- endif %}
|
|
25
|
-
{{ type_config.text | default: change.type }}
|
|
26
|
-
{%- if type_config.icon and show_icons and show_icons == "after" %}
|
|
27
|
-
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]
|
|
28
|
-
{%- endif %}
|
|
29
|
-
{%- endif %}
|
|
30
|
-
{%- if tags_listing != "" and note_show_tags_label %}
|
|
31
|
-
{{- tags_listing | trim }}
|
|
32
|
-
{%- elsif change.tags and change.tags.size > 0 and note_show_tags_label == false %}
|
|
33
|
-
{%- for tag in change.tags %}
|
|
34
|
-
{%- unless tag == "changelog" or tag == "release_note_needed" %}
|
|
35
|
-
{{ config.tags[tag]['text'] | default: tag }}
|
|
36
|
-
{%- endunless %}
|
|
37
|
-
{%- endfor %}
|
|
38
|
-
{%- endif %}
|
|
39
|
-
{%- if note_show_lead and change.lead %}
|
|
40
|
-
{%- if note_show_lead_label %}
|
|
41
|
-
[.meta-label.lead-label]*{{ labeling_lead_label }}:*
|
|
42
|
-
{%- endif %}
|
|
43
|
-
{%- if note_user_link_template %}
|
|
44
|
-
link:{{ note_user_link_template | render: change }}[icon:user[]{{ change.lead }}]
|
|
45
|
-
{%- else %}
|
|
46
|
-
icon:user[]{{ change.lead }}
|
|
47
|
-
{%- endif %}
|
|
48
|
-
{%- endif %}
|
|
49
|
-
{%- if config.links.web.href and config.links.web.href != "" %}
|
|
50
|
-
link:{{ config.links.web.href | render: change }}[icon:{{ config.links.web.icon }}[]{{ config.links.web.text | render: change }}]
|
|
7
|
+
{%- capture change_metadata -%}
|
|
8
|
+
{%- if parts_listing != "" and note_show_parts_label -%}
|
|
9
|
+
{{ parts_listing | trim }} {% endif -%}
|
|
10
|
+
{%- if change.parts and change.parts.size > 0 and note_show_parts_label == false -%}
|
|
11
|
+
{%- for part in change.parts -%}
|
|
12
|
+
{%- unless part == "changelog" or part == "release_note_needed" -%}
|
|
13
|
+
{{ config.parts[part]['text'] | default: part }} {% endunless -%}
|
|
14
|
+
{%- endfor -%}
|
|
51
15
|
{%- endif -%}
|
|
52
|
-
{%- if
|
|
53
|
-
|
|
54
|
-
{%-
|
|
16
|
+
{%- if change.type -%}
|
|
17
|
+
{%- assign type_config = config.types[change.type] -%}
|
|
18
|
+
{%- if note_show_type_label -%}
|
|
19
|
+
**{{ labeling_type_label }}:** {% endif -%}
|
|
20
|
+
{%- if type_config.icon and show_icons and show_icons == "before" -%}
|
|
21
|
+
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]{% endif -%}
|
|
22
|
+
{{ type_config.text | default: change.type }} {% if type_config.icon and show_icons and show_icons == "after" -%}
|
|
23
|
+
icon:{{ type_config.icon | default: 'tag' }}[role=meta-icon]{% endif -%}
|
|
24
|
+
{%- endif -%}
|
|
25
|
+
{%- if tags_listing != "" and note_show_tags_label -%}
|
|
26
|
+
{{ tags_listing | trim }} {% endif -%}
|
|
27
|
+
{%- if change.tags and change.tags.size > 0 and note_show_tags_label == false -%}
|
|
28
|
+
{%- for tag in change.tags -%}
|
|
29
|
+
{%- unless tag == "changelog" or tag == "release_note_needed" -%}
|
|
30
|
+
{{ config.tags[tag]['text'] | default: tag }} {% endunless -%}
|
|
31
|
+
{%- endfor -%}
|
|
32
|
+
{%- endif -%}
|
|
33
|
+
{%- if note_show_lead and change.lead -%}
|
|
34
|
+
{%- if note_show_lead_label -%}
|
|
35
|
+
**{{ labeling_lead_label }}:** {% endif -%}
|
|
36
|
+
{%- if note_user_link_template -%}
|
|
37
|
+
link:{{ note_user_link_template | render: change }}[icon:user[]{{ change.lead }}] {% else -%}
|
|
38
|
+
icon:user[]{{ change.lead }} {% endif -%}
|
|
39
|
+
{%- endif -%}
|
|
40
|
+
{%- if config.links.web.href and config.links.web.href != "" -%}
|
|
41
|
+
link:{{ config.links.web.href | render: change }}[icon:{{ config.links.web.icon }}[]{{ config.links.web.text | render: change }}] {% endif -%}
|
|
42
|
+
{%- if note_show_git_links and config.links.git.href and config.links.git.href != "" -%}
|
|
43
|
+
link:{{ config.links.git.href | render: change }}[icon:{{ config.links.git.icon | default: 'code-fork' }}[]{{ change.hash | slice: 0, 7 }}] {% endif -%}
|
|
55
44
|
{%- endcapture %}
|
|
56
45
|
{%- assign catch_metadata_error = change_metadata %}
|
|
@@ -3,50 +3,12 @@
|
|
|
3
3
|
{%- else %}
|
|
4
4
|
{%- assign change_note = change.note | default: "NO RELEASE NOTE PROVIDED" | trim %}
|
|
5
5
|
{%- endif %}
|
|
6
|
-
{%- include metadata-note.adoc.liquid %}
|
|
7
6
|
|
|
8
7
|
{%- unless changes_listed contains change.chid %}
|
|
9
8
|
[[note-{{ change.chid }}]]
|
|
10
9
|
{%- endunless %}
|
|
11
10
|
[.release-note]
|
|
12
|
-
|
|
13
|
-
|===
|
|
14
|
-
a| {{ change_metadata }} +
|
|
15
|
-
{%- if change.head %}
|
|
16
|
-
*{{ change.head }}* +
|
|
17
|
-
{%- endif %}
|
|
11
|
+
--
|
|
18
12
|
{{ change_note }}
|
|
19
|
-
|
|
20
|
-
{%- elsif config.notes.items.frame == "table-cols-2" %}
|
|
21
|
-
[cols="5,2"]
|
|
22
|
-
|===
|
|
23
|
-
{%- if change.head %}
|
|
24
|
-
2+a| *{{ change.head }}*
|
|
25
|
-
{%- endif %}
|
|
26
|
-
a| {{ change_note }}
|
|
27
|
-
a| {{ change_metadata }}
|
|
28
|
-
|===
|
|
29
|
-
{%- elsif config.notes.items.frame == "desc-list" %}
|
|
30
|
-
{{ change.head }}::
|
|
31
|
-
{{ change_note }} +
|
|
32
|
-
{{ change_metadata }}
|
|
33
|
-
{%- elsif config.notes.items.frame == "admonition" %}
|
|
34
|
-
{%- if change.type == "removal" or change.type == "deprecation" or change.type == "breaking" %}
|
|
35
|
-
{%- assign admonition_type = "WARNING" %}
|
|
36
|
-
{%- elsif change.type == "security" %}
|
|
37
|
-
{%- assign admonition_type = "IMPORTANT" %}
|
|
38
|
-
{%- elsif change.type == "experimental" %}
|
|
39
|
-
{%- assign admonition_type = "TIP" %}
|
|
40
|
-
{%- else %}
|
|
41
|
-
{%- assign admonition_type = "NOTE" %}
|
|
42
|
-
{%- endif %}
|
|
43
|
-
[{{ admonition_type }}]
|
|
44
|
-
{%- if change.head %}
|
|
45
|
-
.{{ change.head }}
|
|
46
|
-
{%- endif %}
|
|
47
|
-
====
|
|
48
|
-
{{ change_note }} +
|
|
49
|
-
{{ change_metadata }}
|
|
50
|
-
====
|
|
51
|
-
{%- endif %}
|
|
13
|
+
--
|
|
52
14
|
|
|
@@ -3,17 +3,15 @@
|
|
|
3
3
|
{% else -%}
|
|
4
4
|
{% assign change_note = change.note | default: "NO RELEASE NOTE PROVIDED" | adoc_to_md | trim -%}
|
|
5
5
|
{% endif -%}
|
|
6
|
-
{% embed metadata-note.md.liquid -%}
|
|
7
6
|
|
|
8
7
|
<a id="note-{{ change.chid }}"></a>
|
|
9
8
|
{%- if config.notes.items.frame == "table" %}
|
|
10
|
-
|
|
|
11
|
-
|
|
12
|
-
| {
|
|
9
|
+
| Details |
|
|
10
|
+
|---------|
|
|
11
|
+
| {% if change.head %}**{{ change.head }}**<br>{% endif %}{{ change_note }} |
|
|
13
12
|
{%- elsif config.notes.items.frame == "desc-list" %}
|
|
14
|
-
**{{ change.head }}**
|
|
15
|
-
{{ change_note }}
|
|
16
|
-
*{{ change_metadata }}*
|
|
13
|
+
**{{ change.head | default: change.summ }}**
|
|
14
|
+
{{ change_note }}
|
|
17
15
|
{% elsif config.notes.items.frame == "admonition" %}
|
|
18
16
|
{% if change.type == "removal" or change.type == "deprecation" or change.type == "breaking" %}
|
|
19
17
|
{% assign admonition_type = "Warning" %}
|
|
@@ -25,13 +23,11 @@
|
|
|
25
23
|
{% assign admonition_type = "Note" %}
|
|
26
24
|
{% endif %}
|
|
27
25
|
|
|
28
|
-
> **{{ admonition_type }}**: {% if change.head %}**{{ change.head }}** - {% endif %}{{ change_note }}
|
|
29
|
-
> {{ change_metadata }}
|
|
26
|
+
> **{{ admonition_type }}**: {% if change.head %}**{{ change.head }}** - {% endif %}{{ change_note }}
|
|
30
27
|
{% else -%}
|
|
31
28
|
{% if change.head -%}
|
|
32
29
|
### {{ change.head }}
|
|
33
30
|
{% endif -%}
|
|
34
31
|
{{ change_note }}
|
|
35
|
-
{{- change_metadata }}
|
|
36
32
|
{% endif %}
|
|
37
33
|
|
|
@@ -19,10 +19,10 @@
|
|
|
19
19
|
{%- if show_labels -%}
|
|
20
20
|
{%- if format == "asciidoc" -%}
|
|
21
21
|
{%- if labeling_singularize_labels and parts_count == 1 -%}
|
|
22
|
-
|
|
22
|
+
**{{ labeling_part_label }}:** {% else -%}**{{ labeling_parts_label }}:** {% endif -%}
|
|
23
23
|
{%- elsif format == "markdown" -%}
|
|
24
24
|
{%- if labeling_singularize_labels and parts_count == 1 -%}
|
|
25
|
-
{{ labeling_part_label }}: {
|
|
25
|
+
{{ labeling_part_label }}: {% else -%}{{ labeling_parts_label }}: {% endif -%}
|
|
26
26
|
{%- endif -%}
|
|
27
27
|
{%- endif -%}
|
|
28
28
|
{%- assign part_texts = "" | split: "," -%}
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
{%- unless skip_part -%}
|
|
39
39
|
{%- capture part_text -%}
|
|
40
40
|
{%- if config.parts[part].icon and show_icons and show_icons == "before" -%}
|
|
41
|
-
{%- if format == "asciidoc" -%}icon:{{ config.parts[part].icon }}[]
|
|
41
|
+
{%- if format == "asciidoc" -%}icon:{{ config.parts[part].icon }}[]{%- endif -%}
|
|
42
42
|
{%- endif -%}
|
|
43
43
|
{%- if format == "asciidoc" -%}
|
|
44
|
-
{{ config.parts[part]['text'] | default: part }}{%- elsif format == "markdown" -%}**{{ config.parts[part]['text'] | default: part }}**{%- endif -%}
|
|
44
|
+
{{ config.parts[part]['head'] | default: config.parts[part]['text'] | default: part }}{%- elsif format == "markdown" -%}**{{ config.parts[part]['head'] | default: config.parts[part]['text'] | default: part }}**{%- endif -%}
|
|
45
45
|
{%- if config.parts[part].icon and show_icons and show_icons == "after" -%}
|
|
46
46
|
{%- if format == "asciidoc" -%} icon:{{ config.parts[part].icon }}[]{%- endif -%}
|
|
47
47
|
{%- endif -%}
|
|
@@ -52,10 +52,10 @@
|
|
|
52
52
|
{%- if part_texts.size > 0 -%}
|
|
53
53
|
{%- if format == "asciidoc" -%}
|
|
54
54
|
{%- for part_text in part_texts -%}
|
|
55
|
-
{{ part_text }}{%- unless forloop.last %} {
|
|
55
|
+
{{ part_text }}{%- unless forloop.last %}, {% endunless -%}
|
|
56
56
|
{%- endfor -%}
|
|
57
57
|
{%- elsif format == "markdown" -%}
|
|
58
|
-
{{ part_texts | join: ", " }}{
|
|
58
|
+
{{ part_texts | join: ", " }}{% endif -%}
|
|
59
59
|
{%- endif -%}
|
|
60
60
|
{%- endcapture -%}
|
|
61
61
|
{%- endif -%}
|
|
@@ -35,8 +35,28 @@ module SchemaGraphy
|
|
|
35
35
|
# Remove surrounding quotes that might come from YAML parsing
|
|
36
36
|
clean_input = input_str.gsub(/^["']|["']$/, '')
|
|
37
37
|
|
|
38
|
+
# Manual parsing for /pattern/flags format (common in YAML configs)
|
|
39
|
+
if clean_input =~ %r{^/(.+)/([a-z]*)$}
|
|
40
|
+
pattern_str = Regexp.last_match(1)
|
|
41
|
+
flags_str = Regexp.last_match(2)
|
|
42
|
+
options = flags_to_options(flags_str)
|
|
43
|
+
|
|
44
|
+
begin
|
|
45
|
+
regexp_obj = Regexp.new(pattern_str, options)
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
pattern: pattern_str,
|
|
49
|
+
flags: flags_str,
|
|
50
|
+
regexp: regexp_obj,
|
|
51
|
+
options: options
|
|
52
|
+
}
|
|
53
|
+
rescue RegexpError => e
|
|
54
|
+
raise RegexpError, "Invalid regex pattern '#{input}': #{e.message}"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
38
58
|
# Heuristic to detect if it's a Regexp literal
|
|
39
|
-
is_literal =
|
|
59
|
+
is_literal = clean_input.start_with?('%r{')
|
|
40
60
|
|
|
41
61
|
if is_literal
|
|
42
62
|
# Try to parse as regex literal using to_regexp
|
data/specs/data/config-def.yml
CHANGED
|
@@ -165,6 +165,7 @@ properties:
|
|
|
165
165
|
Must be `issue_body`, `custom_field`, or `commit_message`.
|
|
166
166
|
|
|
167
167
|
Defaults to `issue_body` for GitHub and GitLab, but to `custom_field` for Jira.
|
|
168
|
+
dflt: issue_body
|
|
168
169
|
note_custom_field:
|
|
169
170
|
type: String
|
|
170
171
|
desc: |
|
|
@@ -182,7 +183,8 @@ properties:
|
|
|
182
183
|
Uses Capture group `note` in the Regular Expression to establish the entire note content.
|
|
183
184
|
|
|
184
185
|
See the `conversions.head_pattern` property for details on extracting a heading (`head` in RHYML) from the `note` content.
|
|
185
|
-
dflt: '/^((#|=)+ (Draft )?Release Note
|
|
186
|
+
dflt: '/^(((#|=)+ (Draft )?Release Note.*?)|(<!-- (draft )?release note -->))\n+(?<note>(.|
|
|
187
|
+
)+)/gmi'
|
|
186
188
|
head_pattern:
|
|
187
189
|
type: RegExp
|
|
188
190
|
desc: |
|
|
@@ -1162,7 +1164,7 @@ properties:
|
|
|
1162
1164
|
The label to use for the _singular_ part/component affected by the change, when only one part is permitted.
|
|
1163
1165
|
|
|
1164
1166
|
This value will apply either when <<conf_ppty_rhyml_max_parts>> is set to `1` or when the change has only one part _and_ <<conf_ppty_history_labeling_singularize_labels>> is `true`.
|
|
1165
|
-
dflt:
|
|
1167
|
+
dflt: Component
|
|
1166
1168
|
parts_icon:
|
|
1167
1169
|
type: String
|
|
1168
1170
|
desc: |
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: releasehx
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- DocOpsLab
|
|
@@ -266,8 +266,8 @@ files:
|
|
|
266
266
|
- bin/rhx-mcp
|
|
267
267
|
- bin/sourcerer
|
|
268
268
|
- build/docs/CNAME
|
|
269
|
-
- build/docs/Gemfile.lock
|
|
270
269
|
- build/docs/_config.yml
|
|
270
|
+
- build/docs/_release_index.adoc
|
|
271
271
|
- build/docs/config-reference.adoc
|
|
272
272
|
- build/docs/config-reference.json
|
|
273
273
|
- build/docs/index.adoc
|
|
@@ -275,6 +275,7 @@ files:
|
|
|
275
275
|
- build/docs/manpage.adoc
|
|
276
276
|
- build/docs/releasehx.1
|
|
277
277
|
- build/docs/releasehx_readme.html
|
|
278
|
+
- build/docs/releases.adoc
|
|
278
279
|
- build/docs/sample-config.adoc
|
|
279
280
|
- build/docs/sample-config.yml
|
|
280
281
|
- build/docs/schemagraphy_readme.html
|
data/build/docs/Gemfile.lock
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
GEM
|
|
2
|
-
remote: https://rubygems.org/
|
|
3
|
-
specs:
|
|
4
|
-
addressable (2.8.7)
|
|
5
|
-
public_suffix (>= 2.0.2, < 7.0)
|
|
6
|
-
asciidoctor (2.0.23)
|
|
7
|
-
base64 (0.3.0)
|
|
8
|
-
bigdecimal (3.2.3)
|
|
9
|
-
colorator (1.1.0)
|
|
10
|
-
concurrent-ruby (1.3.5)
|
|
11
|
-
csv (3.3.5)
|
|
12
|
-
em-websocket (0.5.3)
|
|
13
|
-
eventmachine (>= 0.12.9)
|
|
14
|
-
http_parser.rb (~> 0)
|
|
15
|
-
eventmachine (1.2.7)
|
|
16
|
-
ffi (1.17.2-x86_64-linux-gnu)
|
|
17
|
-
forwardable-extended (2.6.0)
|
|
18
|
-
google-protobuf (4.32.1-x86_64-linux-gnu)
|
|
19
|
-
bigdecimal
|
|
20
|
-
rake (>= 13)
|
|
21
|
-
http_parser.rb (0.8.0)
|
|
22
|
-
i18n (1.14.7)
|
|
23
|
-
concurrent-ruby (~> 1.0)
|
|
24
|
-
jekyll (4.4.1)
|
|
25
|
-
addressable (~> 2.4)
|
|
26
|
-
base64 (~> 0.2)
|
|
27
|
-
colorator (~> 1.0)
|
|
28
|
-
csv (~> 3.0)
|
|
29
|
-
em-websocket (~> 0.5)
|
|
30
|
-
i18n (~> 1.0)
|
|
31
|
-
jekyll-sass-converter (>= 2.0, < 4.0)
|
|
32
|
-
jekyll-watch (~> 2.0)
|
|
33
|
-
json (~> 2.6)
|
|
34
|
-
kramdown (~> 2.3, >= 2.3.1)
|
|
35
|
-
kramdown-parser-gfm (~> 1.0)
|
|
36
|
-
liquid (~> 4.0)
|
|
37
|
-
mercenary (~> 0.3, >= 0.3.6)
|
|
38
|
-
pathutil (~> 0.9)
|
|
39
|
-
rouge (>= 3.0, < 5.0)
|
|
40
|
-
safe_yaml (~> 1.0)
|
|
41
|
-
terminal-table (>= 1.8, < 4.0)
|
|
42
|
-
webrick (~> 1.7)
|
|
43
|
-
jekyll-asciidoc (3.0.1)
|
|
44
|
-
asciidoctor (>= 1.5.0, < 3.0.0)
|
|
45
|
-
jekyll (>= 3.0.0)
|
|
46
|
-
jekyll-include-cache (0.2.1)
|
|
47
|
-
jekyll (>= 3.7, < 5.0)
|
|
48
|
-
jekyll-sass-converter (3.1.0)
|
|
49
|
-
sass-embedded (~> 1.75)
|
|
50
|
-
jekyll-seo-tag (2.8.0)
|
|
51
|
-
jekyll (>= 3.8, < 5.0)
|
|
52
|
-
jekyll-watch (2.2.1)
|
|
53
|
-
listen (~> 3.0)
|
|
54
|
-
json (2.15.0)
|
|
55
|
-
just-the-docs (0.10.1)
|
|
56
|
-
jekyll (>= 3.8.5)
|
|
57
|
-
jekyll-include-cache
|
|
58
|
-
jekyll-seo-tag (>= 2.0)
|
|
59
|
-
rake (>= 12.3.1)
|
|
60
|
-
kramdown (2.5.1)
|
|
61
|
-
rexml (>= 3.3.9)
|
|
62
|
-
kramdown-parser-gfm (1.1.0)
|
|
63
|
-
kramdown (~> 2.0)
|
|
64
|
-
liquid (4.0.4)
|
|
65
|
-
listen (3.9.0)
|
|
66
|
-
rb-fsevent (~> 0.10, >= 0.10.3)
|
|
67
|
-
rb-inotify (~> 0.9, >= 0.9.10)
|
|
68
|
-
mercenary (0.4.0)
|
|
69
|
-
pathutil (0.16.2)
|
|
70
|
-
forwardable-extended (~> 2.6)
|
|
71
|
-
public_suffix (6.0.2)
|
|
72
|
-
rake (13.3.0)
|
|
73
|
-
rb-fsevent (0.11.2)
|
|
74
|
-
rb-inotify (0.11.1)
|
|
75
|
-
ffi (~> 1.0)
|
|
76
|
-
rexml (3.4.4)
|
|
77
|
-
rouge (4.6.1)
|
|
78
|
-
safe_yaml (1.0.5)
|
|
79
|
-
sass-embedded (1.93.2-x86_64-linux-gnu)
|
|
80
|
-
google-protobuf (~> 4.31)
|
|
81
|
-
terminal-table (3.0.2)
|
|
82
|
-
unicode-display_width (>= 1.1.1, < 3)
|
|
83
|
-
unicode-display_width (2.6.0)
|
|
84
|
-
webrick (1.9.1)
|
|
85
|
-
|
|
86
|
-
PLATFORMS
|
|
87
|
-
x86_64-linux
|
|
88
|
-
|
|
89
|
-
DEPENDENCIES
|
|
90
|
-
jekyll
|
|
91
|
-
jekyll-asciidoc
|
|
92
|
-
just-the-docs
|
|
93
|
-
|
|
94
|
-
BUNDLED WITH
|
|
95
|
-
2.4.19
|