bash-merge 2.0.2 → 2.0.3
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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +15 -1
- data/README.md +213 -142
- data/lib/bash/merge/version.rb +1 -1
- data/lib/bash/merge.rb +12 -0
- data.tar.gz.sig +0 -0
- metadata +12 -12
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ca7ede63c1590df94f22fdbffb07c06f1313ae2e09aab64b6b9d1d6174de9077
|
|
4
|
+
data.tar.gz: 885fb700fab46e68b0c614fa936518c0674cb7c3d50ca4466b943ec84dcd25f9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d6d6b14002558067c7234de6e46a027ad47224289f4bc7b93ac64d40e335e4a786d82bda7f78be56381d8fa7ba6b4e2bd9623309ae5a1895247bb4e8151b6a02
|
|
7
|
+
data.tar.gz: 06a3659679935d65f0f389ed492e92b4f1446c2ebd0d527d6d4a5a3f9c3477757396de637067e0ff4b268c2606ba5c55ea5ea9a9b9ead4d35a6791ba777819b0
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,18 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [2.0.3] - 2026-01-11
|
|
34
|
+
|
|
35
|
+
- TAG: [v2.0.3][2.0.3t]
|
|
36
|
+
- COVERAGE: 96.16% -- 501/521 lines in 11 files
|
|
37
|
+
- BRANCH COVERAGE: 76.22% -- 125/164 branches in 11 files
|
|
38
|
+
- 96.33% documented
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- ast-merge v4.0.2
|
|
43
|
+
- tree_haver v5.0.1
|
|
44
|
+
|
|
33
45
|
## [2.0.2] - 2026-01-09
|
|
34
46
|
|
|
35
47
|
- TAG: [v2.0.2][2.0.2t]
|
|
@@ -125,7 +137,9 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
125
137
|
|
|
126
138
|
### Security
|
|
127
139
|
|
|
128
|
-
[Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.
|
|
140
|
+
[Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.3...HEAD
|
|
141
|
+
[2.0.3]: https://github.com/kettle-rb/bash-merge/compare/v2.0.2...v2.0.3
|
|
142
|
+
[2.0.3t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.3
|
|
129
143
|
[2.0.2]: https://github.com/kettle-rb/bash-merge/compare/v2.0.1...v2.0.2
|
|
130
144
|
[2.0.2t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.2
|
|
131
145
|
[2.0.1]: https://github.com/kettle-rb/bash-merge/compare/v2.0.0...v2.0.1
|
data/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
| 📍 NOTE |
|
|
2
2
|
| --- |
|
|
3
|
-
| RubyGems (the [GitHub org]
|
|
4
|
-
| Ultimately [4 maintainers]
|
|
5
|
-
| It is a [complicated story]
|
|
6
|
-
| Simply put - there was active policy for adding or removing maintainers/owners of [rubygems]
|
|
7
|
-
| I'm adding notes like this to gems because I [don't condone theft]
|
|
3
|
+
| RubyGems (the [GitHub org][rubygems-org], not the website) [suffered][draper-security] a [hostile takeover][ellen-takeover] in September 2025. |
|
|
4
|
+
| Ultimately [4 maintainers][simi-removed] were [hard removed][martin-removed] and a reason has been given for only 1 of those, while 2 others resigned in protest. |
|
|
5
|
+
| It is a [complicated story][draper-takeover] which is difficult to [parse quickly][draper-lies]. |
|
|
6
|
+
| Simply put - there was active policy for adding or removing maintainers/owners of [rubygems][rubygems-maint-policy] and [bundler][bundler-maint-policy], and those [policies were not followed][policy-fail]. |
|
|
7
|
+
| I'm adding notes like this to gems because I [don't condone theft][draper-theft] of repositories or gems from their rightful owners. |
|
|
8
8
|
| If a similar theft happened with my repos/gems, I'd hope some would stand up for me. |
|
|
9
|
-
| Disenfranchised former-maintainers have started [gem.coop]
|
|
9
|
+
| Disenfranchised former-maintainers have started [gem.coop][gem-coop]. |
|
|
10
10
|
| Once available I will publish there exclusively; unless RubyCentral makes amends with the community. |
|
|
11
|
-
| The ["Technology for Humans: Joel Draper"]
|
|
12
|
-
| See [here]
|
|
13
|
-
| What I'm doing: A (WIP) proposal for [bundler/gem scopes]
|
|
11
|
+
| The ["Technology for Humans: Joel Draper"][reinteractive-podcast] podcast episode by [reinteractive][reinteractive] is the most cogent summary I'm aware of. |
|
|
12
|
+
| See [here][gem-naming], [here][gem-coop] and [here][martin-ann] for more info on what comes next. |
|
|
13
|
+
| What I'm doing: A (WIP) proposal for [bundler/gem scopes][gem-scopes], and a (WIP) proposal for a federated [gem server][gem-server]. |
|
|
14
14
|
|
|
15
15
|
[rubygems-org]: https://github.com/rubygems/
|
|
16
16
|
[draper-security]: https://joel.drapper.me/p/ruby-central-security-measures/
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
[rubygems-maint-policy]: https://github.com/ruby/rubygems/blob/b1ab33a3d52310a84d16b193991af07f5a6a07c0/doc/rubygems/POLICIES.md?plain=1#L187-L196
|
|
32
32
|
[policy-fail]: https://www.reddit.com/r/ruby/comments/1ove9vp/rubycentral_hates_this_one_fact/
|
|
33
33
|
|
|
34
|
-
[![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0]
|
|
34
|
+
[![Galtzo FLOSS Logo by Aboling0, CC BY-SA 4.0][🖼️galtzo-i]][🖼️galtzo-discord] [![ruby-lang Logo, Yukihiro Matsumoto, Ruby Visual Identity Team, CC BY-SA 2.5][🖼️ruby-lang-i]][🖼️ruby-lang] [![kettle-rb Logo by Aboling0, CC BY-SA 4.0][🖼️kettle-rb-i]][🖼️kettle-rb]
|
|
35
35
|
|
|
36
36
|
[🖼️galtzo-i]: https://logos.galtzo.com/assets/images/galtzo-floss/avatar-192px.svg
|
|
37
37
|
[🖼️galtzo-discord]: https://discord.gg/3qme4XHNKN
|
|
@@ -42,35 +42,37 @@
|
|
|
42
42
|
|
|
43
43
|
# ☯️ Bash::Merge
|
|
44
44
|
|
|
45
|
-
[![Version]
|
|
45
|
+
[![Version][👽versioni]][bash-merge-gem] [![GitHub tag (latest SemVer)][⛳️tag-img]][⛳️tag] [![License: MIT][📄license-img]][📄license-ref] [![Downloads Rank][👽dl-ranki]][bash-merge-gem] [![Open Source Helpers][👽oss-helpi]][👽oss-help] [![CodeCov Test Coverage][🏀codecovi]][🏀codecov] [![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls] [![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov] [![QLTY Maintainability][🏀qlty-mnti]][🏀qlty-mnt] [![CI Heads][🚎3-hd-wfi]][🚎3-hd-wf] [![CI Runtime Dependencies @ HEAD][🚎12-crh-wfi]][🚎12-crh-wf] [![CI Current][🚎11-c-wfi]][bash-merge-ci] [![CI Truffle Ruby][🚎9-t-wfi]][🚎9-t-wf] [![Deps Locked][🚎13-🔒️-wfi]][🚎13-🔒️-wf] [![Deps Unlocked][🚎14-🔓️-wfi]][🚎14-🔓️-wf] [![CI Supported][🚎6-s-wfi]][🚎6-s-wf] [![CI Test Coverage][🚎2-cov-wfi]][🚎2-cov-wf] [![CI Style][🚎5-st-wfi]][🚎5-st-wf] [![CodeQL][🖐codeQL-img]][🖐codeQL] [![Apache SkyWalking Eyes License Compatibility Check][🚎15-🪪-wfi]][🚎15-🪪-wf]
|
|
46
46
|
|
|
47
|
-
`if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know]
|
|
47
|
+
`if ci_badges.map(&:color).detect { it != "green"}` ☝️ [let me know][🖼️galtzo-discord], as I may have missed the [discord notification][🖼️galtzo-discord].
|
|
48
48
|
|
|
49
49
|
-----
|
|
50
|
+
|
|
50
51
|
`if ci_badges.map(&:color).all? { it == "green"}` 👇️ send money so I can do more of this. FLOSS maintenance is now my full-time job.
|
|
51
52
|
|
|
52
|
-
[![OpenCollective Backers]
|
|
53
|
+
[![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate at ko-fi.com][🖇kofi-img]][🖇kofi]
|
|
53
54
|
|
|
54
55
|
## 🌻 Synopsis
|
|
55
56
|
|
|
56
|
-
Bash::Merge is a standalone Ruby module that intelligently merges two versions of a Bash script using tree-sitter AST analysis. It's like a smart "git merge" specifically designed for shell scripts. Built on top of [ast-merge]
|
|
57
|
+
Bash::Merge is a standalone Ruby module that intelligently merges two versions of a Bash script using tree-sitter AST analysis. It's like a smart "git merge" specifically designed for shell scripts. Built on top of [ast-merge][ast-merge], it shares the same architecture as [prism-merge][prism-merge] for Ruby source files.
|
|
57
58
|
|
|
58
59
|
### Key Features
|
|
59
60
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
61
|
+
- **Tree-Sitter Powered**: Uses tree-sitter-bash for accurate AST parsing
|
|
62
|
+
- **Script-Aware**: Understands Bash syntax including functions, variables, and commands
|
|
63
|
+
- **Intelligent**: Matches functions and variable assignments by name
|
|
64
|
+
- **Comment-Preserving**: Comments are preserved in their context
|
|
65
|
+
- **Shebang Handling**: Properly handles `#!/bin/bash` and similar shebangs
|
|
66
|
+
- **Freeze Block Support**: Respects freeze markers (default: `bash-merge:freeze` / `bash-merge:unfreeze`) for merge control - customizable to match your project's conventions
|
|
67
|
+
- **Full Provenance**: Tracks origin of every node
|
|
68
|
+
- **Standalone**: Minimal dependencies - just `ast-merge` and `ruby_tree_sitter`
|
|
69
|
+
- **Customizable**:
|
|
70
|
+
- `signature_generator` - callable custom signature generators
|
|
71
|
+
- `preference` - setting of `:template`, `:destination`, or a Hash for per-node-type preferences
|
|
72
|
+
- `node_splitter` - Hash mapping node types to callables for per-node-type merge customization (see [ast-merge][ast-merge] docs)
|
|
73
|
+
- `add_template_only_nodes` - setting to retain nodes that do not exist in destination
|
|
74
|
+
- `freeze_token` - customize freeze block markers (default: `"bash-merge"`)
|
|
75
|
+
|
|
74
76
|
### Supported Node Types
|
|
75
77
|
|
|
76
78
|
| Node Type | Signature Format | Matching Behavior |
|
|
@@ -86,7 +88,7 @@ Bash::Merge is a standalone Ruby module that intelligently merges two versions o
|
|
|
86
88
|
|
|
87
89
|
### Example
|
|
88
90
|
|
|
89
|
-
```
|
|
91
|
+
```ruby
|
|
90
92
|
require "bash/merge"
|
|
91
93
|
|
|
92
94
|
template = File.read("template.sh")
|
|
@@ -102,21 +104,21 @@ File.write("merged.sh", result.to_bash)
|
|
|
102
104
|
|
|
103
105
|
The `*-merge` gem family provides intelligent, AST-based merging for various file formats. At the foundation is [tree_haver][tree_haver], which provides a unified cross-Ruby parsing API that works seamlessly across MRI, JRuby, and TruffleRuby.
|
|
104
106
|
|
|
105
|
-
| Gem | Language<br>/ Format
|
|
106
|
-
|
|
107
|
-
| [tree_haver][tree_haver] | Multi
|
|
108
|
-
| [ast-merge][ast-merge] | Text
|
|
109
|
-
| [bash-merge][bash-merge] |
|
|
110
|
-
| [commonmarker-merge][commonmarker-merge] | Markdown
|
|
111
|
-
| [dotenv-merge][dotenv-merge] | Dotenv
|
|
112
|
-
| [json-merge][json-merge] |
|
|
113
|
-
| [jsonc-merge][jsonc-merge] | JSONC
|
|
114
|
-
| [markdown-merge][markdown-merge] | Markdown
|
|
115
|
-
| [markly-merge][markly-merge] |
|
|
116
|
-
| [prism-merge][prism-merge] | Ruby
|
|
117
|
-
| [psych-merge][psych-merge] | YAML
|
|
118
|
-
| [rbs-merge][rbs-merge] | RBS
|
|
119
|
-
| [toml-merge][toml-merge] |
|
|
107
|
+
| Gem | Version | CI | | Language<br>/ Format | Parser Backend(s) | Description |
|
|
108
|
+
|------------------------------------------|----------------------------------------------------------------|--------------------------------------------------------------|----------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|-------------|
|
|
109
|
+
| [tree_haver][tree_haver] | [![Version][tree_haver-gem-i]][tree_haver-gem] | [![Version][tree_haver-ci-i]][tree_haver-ci] | Multi | MRI C, Rust, FFI, Java, Prism, Psych, Commonmarker, Markly, Citrus, Parslet | **Foundation**: Cross-Ruby adapter for parsing libraries (like Faraday for HTTP) |
|
|
110
|
+
| [ast-merge][ast-merge] | [![Version][ast-merge-gem-i]][ast-merge-gem] | [![Version][ast-merge-ci-i]][ast-merge-ci] | Text | internal | **Infrastructure**: Shared base classes and merge logic for all `*-merge` gems |
|
|
111
|
+
| [bash-merge][bash-merge] | [![Version][bash-merge-gem-i]][bash-merge-gem] | [![Version][bash-merge-ci-i]][bash-merge-ci] | Bash | [tree-sitter-bash][ts-bash] (via tree_haver) | Smart merge for Bash scripts |
|
|
112
|
+
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem] | [![Version][commonmarker-merge-ci-i]][commonmarker-merge-ci] | Markdown | [Commonmarker][commonmarker] (via tree_haver) | Smart merge for Markdown (CommonMark via comrak Rust) |
|
|
113
|
+
| [dotenv-merge][dotenv-merge] | [![Version][dotenv-merge-gem-i]][dotenv-merge-gem] | [![Version][dotenv-merge-ci-i]][dotenv-merge-ci] | Dotenv | internal | Smart merge for `.env` files |
|
|
114
|
+
| [json-merge][json-merge] | [![Version][json-merge-gem-i]][json-merge-gem] | [![Version][json-merge-ci-i]][json-merge-ci] | JSON | [tree-sitter-json][ts-json] (via tree_haver) | Smart merge for JSON files |
|
|
115
|
+
| [jsonc-merge][jsonc-merge] | [![Version][jsonc-merge-gem-i]][jsonc-merge-gem] | [![Version][jsonc-merge-ci-i]][jsonc-merge-ci] | JSONC | [tree-sitter-jsonc][ts-jsonc] (via tree_haver) | ⚠️ Proof of concept; Smart merge for JSON with Comments |
|
|
116
|
+
| [markdown-merge][markdown-merge] | [![Version][markdown-merge-gem-i]][markdown-merge-gem] | [![Version][markdown-merge-ci-i]][markdown-merge-ci] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver) | **Foundation**: Shared base for Markdown mergers with inner code block merging |
|
|
117
|
+
| [markly-merge][markly-merge] | [![Version][markly-merge-gem-i]][markly-merge-gem] | [![Version][markly-merge-ci-i]][markly-merge-ci] | Markdown | [Markly][markly] (via tree_haver) | Smart merge for Markdown (CommonMark via cmark-gfm C) |
|
|
118
|
+
| [prism-merge][prism-merge] | [![Version][prism-merge-gem-i]][prism-merge-gem] | [![Version][prism-merge-ci-i]][prism-merge-ci] | Ruby | [Prism][prism] (`prism` std lib gem) | Smart merge for Ruby source files |
|
|
119
|
+
| [psych-merge][psych-merge] | [![Version][psych-merge-gem-i]][psych-merge-gem] | [![Version][psych-merge-ci-i]][psych-merge-ci] | YAML | [Psych][psych] (`psych` std lib gem) | Smart merge for YAML files |
|
|
120
|
+
| [rbs-merge][rbs-merge] | [![Version][rbs-merge-gem-i]][rbs-merge-gem] | [![Version][rbs-merge-ci-i]][rbs-merge-ci] | RBS | [tree-sitter-bash][ts-rbs] (via tree_haver), [RBS][rbs] (`rbs` std lib gem) | Smart merge for Ruby type signatures |
|
|
121
|
+
| [toml-merge][toml-merge] | [![Version][toml-merge-gem-i]][toml-merge-gem] | [![Version][toml-merge-ci-i]][toml-merge-ci] | TOML | [Parslet + toml][toml], [Citrus + toml-rb][toml-rb], [tree-sitter-toml][ts-toml] (all via tree_haver) | Smart merge for TOML files |
|
|
120
122
|
|
|
121
123
|
#### Backend Platform Compatibility
|
|
122
124
|
|
|
@@ -130,7 +132,8 @@ tree_haver supports multiple parsing backends, but not all backends work on all
|
|
|
130
132
|
| **Java** ([jtreesitter][jtreesitter]) | ❌ | ✅ | ❌ | JRuby only, requires grammar JARs |
|
|
131
133
|
| **Prism** | ✅ | ✅ | ✅ | Ruby parsing, stdlib in Ruby 3.4+ |
|
|
132
134
|
| **Psych** | ✅ | ✅ | ✅ | YAML parsing, stdlib |
|
|
133
|
-
| **Citrus** | ✅ | ✅ | ✅ | Pure Ruby, no native dependencies
|
|
135
|
+
| **Citrus** | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
|
|
136
|
+
| **Parslet** | ✅ | ✅ | ✅ | Pure Ruby PEG parser, no native dependencies |
|
|
134
137
|
| **Commonmarker** | ✅ | ❌ | ❓ | Rust extension for Markdown |
|
|
135
138
|
| **Markly** | ✅ | ❌ | ❓ | C extension for Markdown |
|
|
136
139
|
|
|
@@ -164,6 +167,66 @@ tree_haver supports multiple parsing backends, but not all backends work on all
|
|
|
164
167
|
[commonmarker-merge]: https://github.com/kettle-rb/commonmarker-merge
|
|
165
168
|
[kettle-dev]: https://github.com/kettle-rb/kettle-dev
|
|
166
169
|
[kettle-jem]: https://github.com/kettle-rb/kettle-jem
|
|
170
|
+
[tree_haver-gem]: https://bestgems.org/gems/tree_haver
|
|
171
|
+
[ast-merge-gem]: https://bestgems.org/gems/ast-merge
|
|
172
|
+
[prism-merge-gem]: https://bestgems.org/gems/prism-merge
|
|
173
|
+
[psych-merge-gem]: https://bestgems.org/gems/psych-merge
|
|
174
|
+
[json-merge-gem]: https://bestgems.org/gems/json-merge
|
|
175
|
+
[jsonc-merge-gem]: https://bestgems.org/gems/jsonc-merge
|
|
176
|
+
[bash-merge-gem]: https://bestgems.org/gems/bash-merge
|
|
177
|
+
[rbs-merge-gem]: https://bestgems.org/gems/rbs-merge
|
|
178
|
+
[dotenv-merge-gem]: https://bestgems.org/gems/dotenv-merge
|
|
179
|
+
[toml-merge-gem]: https://bestgems.org/gems/toml-merge
|
|
180
|
+
[markdown-merge-gem]: https://bestgems.org/gems/markdown-merge
|
|
181
|
+
[markly-merge-gem]: https://bestgems.org/gems/markly-merge
|
|
182
|
+
[commonmarker-merge-gem]: https://bestgems.org/gems/commonmarker-merge
|
|
183
|
+
[kettle-dev-gem]: https://bestgems.org/gems/kettle-dev
|
|
184
|
+
[kettle-jem-gem]: https://bestgems.org/gems/kettle-jem
|
|
185
|
+
[tree_haver-gem-i]: https://img.shields.io/gem/v/tree_haver.svg
|
|
186
|
+
[ast-merge-gem-i]: https://img.shields.io/gem/v/ast-merge.svg
|
|
187
|
+
[prism-merge-gem-i]: https://img.shields.io/gem/v/prism-merge.svg
|
|
188
|
+
[psych-merge-gem-i]: https://img.shields.io/gem/v/psych-merge.svg
|
|
189
|
+
[json-merge-gem-i]: https://img.shields.io/gem/v/json-merge.svg
|
|
190
|
+
[jsonc-merge-gem-i]: https://img.shields.io/gem/v/jsonc-merge.svg
|
|
191
|
+
[bash-merge-gem-i]: https://img.shields.io/gem/v/bash-merge.svg
|
|
192
|
+
[rbs-merge-gem-i]: https://img.shields.io/gem/v/rbs-merge.svg
|
|
193
|
+
[dotenv-merge-gem-i]: https://img.shields.io/gem/v/dotenv-merge.svg
|
|
194
|
+
[toml-merge-gem-i]: https://img.shields.io/gem/v/toml-merge.svg
|
|
195
|
+
[markdown-merge-gem-i]: https://img.shields.io/gem/v/markdown-merge.svg
|
|
196
|
+
[markly-merge-gem-i]: https://img.shields.io/gem/v/markly-merge.svg
|
|
197
|
+
[commonmarker-merge-gem-i]: https://img.shields.io/gem/v/commonmarker-merge.svg
|
|
198
|
+
[kettle-dev-gem-i]: https://img.shields.io/gem/v/kettle-dev.svg
|
|
199
|
+
[kettle-jem-gem-i]: https://img.shields.io/gem/v/kettle-jem.svg
|
|
200
|
+
[tree_haver-ci-i]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml/badge.svg
|
|
201
|
+
[ast-merge-ci-i]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml/badge.svg
|
|
202
|
+
[prism-merge-ci-i]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml/badge.svg
|
|
203
|
+
[psych-merge-ci-i]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml/badge.svg
|
|
204
|
+
[json-merge-ci-i]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml/badge.svg
|
|
205
|
+
[jsonc-merge-ci-i]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml/badge.svg
|
|
206
|
+
[bash-merge-ci-i]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml/badge.svg
|
|
207
|
+
[rbs-merge-ci-i]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml/badge.svg
|
|
208
|
+
[dotenv-merge-ci-i]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml/badge.svg
|
|
209
|
+
[toml-merge-ci-i]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml/badge.svg
|
|
210
|
+
[markdown-merge-ci-i]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml/badge.svg
|
|
211
|
+
[markly-merge-ci-i]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml/badge.svg
|
|
212
|
+
[commonmarker-merge-ci-i]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml/badge.svg
|
|
213
|
+
[kettle-dev-ci-i]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml/badge.svg
|
|
214
|
+
[kettle-jem-ci-i]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml/badge.svg
|
|
215
|
+
[tree_haver-ci]: https://github.com/kettle-rb/tree_haver/actions/workflows/current.yml
|
|
216
|
+
[ast-merge-ci]: https://github.com/kettle-rb/ast-merge/actions/workflows/current.yml
|
|
217
|
+
[prism-merge-ci]: https://github.com/kettle-rb/prism-merge/actions/workflows/current.yml
|
|
218
|
+
[psych-merge-ci]: https://github.com/kettle-rb/psych-merge/actions/workflows/current.yml
|
|
219
|
+
[json-merge-ci]: https://github.com/kettle-rb/json-merge/actions/workflows/current.yml
|
|
220
|
+
[jsonc-merge-ci]: https://github.com/kettle-rb/jsonc-merge/actions/workflows/current.yml
|
|
221
|
+
[bash-merge-ci]: https://github.com/kettle-rb/bash-merge/actions/workflows/current.yml
|
|
222
|
+
[rbs-merge-ci]: https://github.com/kettle-rb/rbs-merge/actions/workflows/current.yml
|
|
223
|
+
[dotenv-merge-ci]: https://github.com/kettle-rb/dotenv-merge/actions/workflows/current.yml
|
|
224
|
+
[toml-merge-ci]: https://github.com/kettle-rb/toml-merge/actions/workflows/current.yml
|
|
225
|
+
[markdown-merge-ci]: https://github.com/kettle-rb/markdown-merge/actions/workflows/current.yml
|
|
226
|
+
[markly-merge-ci]: https://github.com/kettle-rb/markly-merge/actions/workflows/current.yml
|
|
227
|
+
[commonmarker-merge-ci]: https://github.com/kettle-rb/commonmarker-merge/actions/workflows/current.yml
|
|
228
|
+
[kettle-dev-ci]: https://github.com/kettle-rb/kettle-dev/actions/workflows/current.yml
|
|
229
|
+
[kettle-jem-ci]: https://github.com/kettle-rb/kettle-jem/actions/workflows/current.yml
|
|
167
230
|
[prism]: https://github.com/ruby/prism
|
|
168
231
|
[psych]: https://github.com/ruby/psych
|
|
169
232
|
[ts-json]: https://github.com/tree-sitter/tree-sitter-json
|
|
@@ -174,6 +237,7 @@ tree_haver supports multiple parsing backends, but not all backends work on all
|
|
|
174
237
|
[dotenv]: https://github.com/bkeepers/dotenv
|
|
175
238
|
[rbs]: https://github.com/ruby/rbs
|
|
176
239
|
[toml-rb]: https://github.com/emancu/toml-rb
|
|
240
|
+
[toml]: https://github.com/jm/toml
|
|
177
241
|
[markly]: https://github.com/ioquatix/markly
|
|
178
242
|
[commonmarker]: https://github.com/gjtorikian/commonmarker
|
|
179
243
|
[ruby_tree_sitter]: https://github.com/Faveod/ruby-tree-sitter
|
|
@@ -182,18 +246,18 @@ tree_haver supports multiple parsing backends, but not all backends work on all
|
|
|
182
246
|
|
|
183
247
|
## 💡 Info you can shake a stick at
|
|
184
248
|
|
|
185
|
-
| Tokens to Remember | [![Gem name]
|
|
249
|
+
| Tokens to Remember | [![Gem name][⛳️name-img]][bash-merge-gem] [![Gem namespace][⛳️namespace-img]][bash-merge] |
|
|
186
250
|
| --- | --- |
|
|
187
|
-
| Works with JRuby | [![JRuby 10.0 Compat]
|
|
188
|
-
| Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat]
|
|
189
|
-
| Works with MRI Ruby 3 | [![Ruby 3.2 Compat]
|
|
190
|
-
| Support & Community | [![Join Me on Daily.dev's RubyFriends]
|
|
191
|
-
| Source | [![Source on GitLab.com]
|
|
192
|
-
| Documentation | [![Current release on RubyDoc.info]
|
|
193
|
-
| Compliance | [![License: MIT]
|
|
194
|
-
| Style | [![Enforced Code Style Linter]
|
|
195
|
-
| Maintainer 🎖️ | [![Follow Me on LinkedIn]
|
|
196
|
-
| `...` 💖 | [![Find Me on WellFound:]
|
|
251
|
+
| Works with JRuby | [![JRuby 10.0 Compat][💎jruby-c-i]][bash-merge-ci] [![JRuby HEAD Compat][💎jruby-headi]][🚎3-hd-wf] |
|
|
252
|
+
| Works with Truffle Ruby | [![Truffle Ruby 23.1 Compat][💎truby-23.1i]][🚎9-t-wf] [![Truffle Ruby 24.1 Compat][💎truby-c-i]][bash-merge-ci] |
|
|
253
|
+
| Works with MRI Ruby 3 | [![Ruby 3.2 Compat][💎ruby-3.2i]][🚎6-s-wf] [![Ruby 3.3 Compat][💎ruby-3.3i]][🚎6-s-wf] [![Ruby 3.4 Compat][💎ruby-c-i]][bash-merge-ci] [![Ruby HEAD Compat][💎ruby-headi]][🚎3-hd-wf] |
|
|
254
|
+
| Support & Community | [![Join Me on Daily.dev's RubyFriends][✉️ruby-friends-img]][✉️ruby-friends] [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord] [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork] [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor] |
|
|
255
|
+
| Source | [![Source on GitLab.com][📜src-gl-img]][📜src-gl] [![Source on CodeBerg.org][📜src-cb-img]][📜src-cb] [![Source on Github.com][📜src-gh-img]][bash-merge] [][🧮kloc] |
|
|
256
|
+
| Documentation | [![Current release on RubyDoc.info][📜docs-cr-rd-img]][🚎yard-current] [![YARD on Galtzo.com][📜docs-head-rd-img]][🚎yard-head] [![Maintainer Blog][🚂maint-blog-img]][🚂maint-blog] [![GitLab Wiki][📜gl-wiki-img]][📜gl-wiki] [![GitHub Wiki][📜gh-wiki-img]][📜gh-wiki] |
|
|
257
|
+
| Compliance | [![License: MIT][📄license-img]][📄license-ref] [![Compatible with Apache Software Projects: Verified by SkyWalking Eyes][📄license-compat-img]][📄license-compat] [![📄ilo-declaration-img][📄ilo-declaration-img]][📄ilo-declaration] [![Security Policy][🔐security-img]][🔐security] [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct] [![SemVer 2.0.0][📌semver-img]][📌semver] |
|
|
258
|
+
| Style | [![Enforced Code Style Linter][💎rlts-img]][💎rlts] [![Keep-A-Changelog 1.0.0][📗keep-changelog-img]][📗keep-changelog] [![Gitmoji Commits][📌gitmoji-img]][📌gitmoji] [![Compatibility appraised by: appraisal2][💎appraisal2-img]][💎appraisal2] |
|
|
259
|
+
| Maintainer 🎖️ | [![Follow Me on LinkedIn][💖🖇linkedin-img]][💖🖇linkedin] [![Follow Me on Ruby.Social][💖🐘ruby-mast-img]][💖🐘ruby-mast] [![Follow Me on Bluesky][💖🦋bluesky-img]][💖🦋bluesky] [![Contact Maintainer][🚂maint-contact-img]][🚂maint-contact] [![My technical writing][💖💁🏼♂️devto-img]][💖💁🏼♂️devto] |
|
|
260
|
+
| `...` 💖 | [![Find Me on WellFound:][💖✌️wellfound-img]][💖✌️wellfound] [![Find Me on CrunchBase][💖💲crunchbase-img]][💖💲crunchbase] [![My LinkTree][💖🌳linktree-img]][💖🌳linktree] [![More About Me][💖💁🏼♂️aboutme-img]][💖💁🏼♂️aboutme] [🧊][💖🧊berg] [🐙][💖🐙hub] [🛖][💖🛖hut] [🧪][💖🧪lab] |
|
|
197
261
|
|
|
198
262
|
### Compatibility
|
|
199
263
|
|
|
@@ -201,25 +265,25 @@ Compatible with MRI Ruby 3.2.0+, and concordant releases of JRuby, and TruffleRu
|
|
|
201
265
|
|
|
202
266
|
| 🚚 *Amazing* test matrix was brought to you by | 🔎 appraisal2 🔎 and the color 💚 green 💚 |
|
|
203
267
|
| --- | --- |
|
|
204
|
-
| 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2]
|
|
268
|
+
| 👟 Check it out\! | ✨ [github.com/appraisal-rb/appraisal2][💎appraisal2] ✨ |
|
|
205
269
|
|
|
206
270
|
### Federated DVCS
|
|
207
271
|
|
|
208
272
|
<details markdown="1">
|
|
209
273
|
<summary>Find this repo on federated forges (Coming soon!)</summary>
|
|
210
274
|
|
|
211
|
-
| Federated [DVCS]
|
|
275
|
+
| Federated [DVCS][💎d-in-dvcs] Repository | Status | Issues | PRs | Wiki | CI | Discussions |
|
|
212
276
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
213
|
-
| 🧪 [kettle-rb/bash-merge on GitLab]
|
|
214
|
-
| 🧊 [kettle-rb/bash-merge on CodeBerg]
|
|
215
|
-
| 🐙 [kettle-rb/bash-merge on GitHub]
|
|
216
|
-
| 🎮️ [Discord Server]
|
|
277
|
+
| 🧪 [kettle-rb/bash-merge on GitLab][📜src-gl] | The Truth | [💚][🤝gl-issues] | [💚][🤝gl-pulls] | [💚][📜gl-wiki] | 🐭 Tiny Matrix | ➖ |
|
|
278
|
+
| 🧊 [kettle-rb/bash-merge on CodeBerg][📜src-cb] | An Ethical Mirror ([Donate][🤝cb-donate]) | [💚][🤝cb-issues] | [💚][🤝cb-pulls] | ➖ | ⭕️ No Matrix | ➖ |
|
|
279
|
+
| 🐙 [kettle-rb/bash-merge on GitHub][📜src-gh] | Another Mirror | [💚][🤝gh-issues] | [💚][🤝gh-pulls] | [💚][📜gh-wiki] | 💯 Full Matrix | [💚][gh-discussions] |
|
|
280
|
+
| 🎮️ [Discord Server][🖼️galtzo-discord] | [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord] | [Let's][🖼️galtzo-discord] | [talk][🖼️galtzo-discord] | [about][🖼️galtzo-discord] | [this][🖼️galtzo-discord] | [library\!][🖼️galtzo-discord] |
|
|
217
281
|
|
|
218
282
|
</details>
|
|
219
283
|
|
|
220
284
|
[gh-discussions]: https://github.com/kettle-rb/bash-merge/discussions
|
|
221
285
|
|
|
222
|
-
### Enterprise Support []
|
|
286
|
+
### Enterprise Support [][🏙️entsup-tidelift]
|
|
223
287
|
|
|
224
288
|
Available as part of the Tidelift Subscription.
|
|
225
289
|
|
|
@@ -228,33 +292,30 @@ Available as part of the Tidelift Subscription.
|
|
|
228
292
|
|
|
229
293
|
The maintainers of this and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use.
|
|
230
294
|
|
|
231
|
-
[![Get help from me on Tidelift]
|
|
232
|
-
|
|
233
|
-
- 💡Subscribe for support guarantees covering *all* your FLOSS dependencies
|
|
295
|
+
[![Get help from me on Tidelift][🏙️entsup-tidelift-img]][🏙️entsup-tidelift]
|
|
234
296
|
|
|
235
|
-
|
|
297
|
+
- 💡Subscribe for support guarantees covering *all* your FLOSS dependencies
|
|
298
|
+
- 💡Tidelift is part of [Sonar][🏙️entsup-tidelift-sonar]
|
|
299
|
+
- 💡Tidelift pays maintainers to maintain the software you depend on\!<br/>📊`@`Pointy Haired Boss: An [enterprise support][🏙️entsup-tidelift] subscription is "[never gonna let you down][🧮kloc]", and *supports* open source maintainers
|
|
300
|
+
Alternatively:
|
|
236
301
|
|
|
237
|
-
|
|
238
|
-
|
|
302
|
+
- [![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
|
|
303
|
+
- [![Get help from me on Upwork][👨🏼🏫expsup-upwork-img]][👨🏼🏫expsup-upwork]
|
|
304
|
+
- [![Get help from me on Codementor][👨🏼🏫expsup-codementor-img]][👨🏼🏫expsup-codementor]
|
|
239
305
|
|
|
240
|
-
- [](https://discord.gg/3qme4XHNKN)
|
|
241
|
-
|
|
242
|
-
- [](https://www.upwork.com/freelancers/~014942e9b056abdf86?mp_source=share)
|
|
243
|
-
|
|
244
|
-
- [](https://www.codementor.io/peterboling?utm_source=github&utm_medium=button&utm_term=peterboling&utm_campaign=github)
|
|
245
306
|
</details>
|
|
246
307
|
|
|
247
308
|
## ✨ Installation
|
|
248
309
|
|
|
249
310
|
Install the gem and add to the application's Gemfile by executing:
|
|
250
311
|
|
|
251
|
-
```
|
|
312
|
+
```console
|
|
252
313
|
bundle add bash-merge
|
|
253
314
|
```
|
|
254
315
|
|
|
255
316
|
If bundler is not being used to manage dependencies, install the gem by executing:
|
|
256
317
|
|
|
257
|
-
```
|
|
318
|
+
```console
|
|
258
319
|
gem install bash-merge
|
|
259
320
|
```
|
|
260
321
|
|
|
@@ -263,19 +324,19 @@ gem install bash-merge
|
|
|
263
324
|
<details markdown="1">
|
|
264
325
|
<summary>For Medium or High Security Installations</summary>
|
|
265
326
|
|
|
266
|
-
This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512]
|
|
267
|
-
[stone\_checksums]
|
|
327
|
+
This gem is cryptographically signed, and has verifiable [SHA-256 and SHA-512][💎SHA_checksums] checksums by
|
|
328
|
+
[stone\_checksums][💎stone_checksums]. Be sure the gem you install hasn’t been tampered with
|
|
268
329
|
by following the instructions below.
|
|
269
330
|
|
|
270
331
|
Add my public key (if you haven’t already, expires 2045-04-29) as a trusted certificate:
|
|
271
332
|
|
|
272
|
-
```
|
|
333
|
+
```console
|
|
273
334
|
gem cert --add <(curl -Ls https://raw.github.com/galtzo-floss/certs/main/pboling.pem)
|
|
274
335
|
```
|
|
275
336
|
|
|
276
337
|
You only need to do that once. Then proceed to install with:
|
|
277
338
|
|
|
278
|
-
```
|
|
339
|
+
```console
|
|
279
340
|
gem install bash-merge -P HighSecurity
|
|
280
341
|
```
|
|
281
342
|
|
|
@@ -283,7 +344,7 @@ The `HighSecurity` trust profile will verify signed gems, and not allow the inst
|
|
|
283
344
|
|
|
284
345
|
If you want to up your security game full-time:
|
|
285
346
|
|
|
286
|
-
```
|
|
347
|
+
```console
|
|
287
348
|
bundle config set --global trust-policy MediumSecurity
|
|
288
349
|
```
|
|
289
350
|
|
|
@@ -304,7 +365,8 @@ Bash syntax parsing capabilities.
|
|
|
304
365
|
Download pre-built parsers from [Faveod/tree-sitter-parsers](https://github.com/Faveod/tree-sitter-parsers/releases):
|
|
305
366
|
|
|
306
367
|
**Linux (x64):**
|
|
307
|
-
|
|
368
|
+
|
|
369
|
+
```console
|
|
308
370
|
# Download and extract
|
|
309
371
|
curl -Lo parsers.tar.gz https://github.com/Faveod/tree-sitter-parsers/releases/download/v4.10/tree-sitter-parsers-4.10-linux-x64.tar.gz
|
|
310
372
|
tar -xzf parsers.tar.gz
|
|
@@ -320,13 +382,15 @@ export TREE_SITTER_BASH_PATH="$HOME/.local/lib/tree-sitter/libtree-sitter-bash.s
|
|
|
320
382
|
```
|
|
321
383
|
|
|
322
384
|
**Debian/Ubuntu (amd64):**
|
|
323
|
-
|
|
385
|
+
|
|
386
|
+
```console
|
|
324
387
|
curl -Lo parsers.deb https://github.com/Faveod/tree-sitter-parsers/releases/download/v4.10/tree-sitter-parsers-4.10-amd64.deb
|
|
325
388
|
sudo dpkg -i parsers.deb
|
|
326
389
|
```
|
|
327
390
|
|
|
328
391
|
**macOS (Apple Silicon):**
|
|
329
|
-
|
|
392
|
+
|
|
393
|
+
```console
|
|
330
394
|
curl -Lo parsers.tar.gz https://github.com/Faveod/tree-sitter-parsers/releases/download/v4.10/tree-sitter-parsers-4.10-macos-arm64.tar.gz
|
|
331
395
|
tar -xzf parsers.tar.gz
|
|
332
396
|
|
|
@@ -338,7 +402,7 @@ export TREE_SITTER_BASH_PATH="$HOME/.local/lib/tree-sitter/libtree-sitter-bash.d
|
|
|
338
402
|
|
|
339
403
|
#### Option 2: Build from Source
|
|
340
404
|
|
|
341
|
-
```
|
|
405
|
+
```console
|
|
342
406
|
git clone https://github.com/tree-sitter/tree-sitter-bash.git
|
|
343
407
|
cd tree-sitter-bash
|
|
344
408
|
make
|
|
@@ -352,7 +416,8 @@ sudo cp libtree-sitter-bash.dylib /usr/local/lib/ # macOS
|
|
|
352
416
|
Some package managers provide tree-sitter parsers:
|
|
353
417
|
|
|
354
418
|
**Fedora Atomic (Silverblue, Kinoite, Bazzite, Aurora, etc.):**
|
|
355
|
-
|
|
419
|
+
|
|
420
|
+
```console
|
|
356
421
|
# Install via rpm-ostree (requires reboot)
|
|
357
422
|
rpm-ostree install libtree-sitter-bash
|
|
358
423
|
|
|
@@ -362,12 +427,14 @@ export TREE_SITTER_BASH_PATH="/usr/lib64/libtree-sitter-bash.so"
|
|
|
362
427
|
```
|
|
363
428
|
|
|
364
429
|
**Fedora (traditional):**
|
|
365
|
-
|
|
430
|
+
|
|
431
|
+
```console
|
|
366
432
|
sudo dnf install libtree-sitter-bash
|
|
367
433
|
```
|
|
368
434
|
|
|
369
435
|
**Arch Linux:**
|
|
370
|
-
|
|
436
|
+
|
|
437
|
+
```console
|
|
371
438
|
# Check AUR for tree-sitter-bash
|
|
372
439
|
yay -S tree-sitter-bash
|
|
373
440
|
```
|
|
@@ -377,16 +444,18 @@ yay -S tree-sitter-bash
|
|
|
377
444
|
If the parser is not in a standard location (`/usr/lib/`, `/usr/lib64/`, `/usr/local/lib/`),
|
|
378
445
|
set the `TREE_SITTER_BASH_PATH` environment variable to point to the parser library:
|
|
379
446
|
|
|
380
|
-
```
|
|
447
|
+
```console
|
|
381
448
|
export TREE_SITTER_BASH_PATH="/path/to/libtree-sitter-bash.so"
|
|
382
449
|
```
|
|
383
450
|
|
|
384
451
|
**Note:** Some distributions install the library with a version number suffix
|
|
385
452
|
(e.g., `libtree-sitter-bash.so.14` instead of `libtree-sitter-bash.so`).
|
|
386
453
|
If the gem can't find the parser, check for versioned files and either:
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
454
|
+
|
|
455
|
+
- Set `TREE_SITTER_BASH_PATH` to the full versioned path, or
|
|
456
|
+
- Create a symlink: `sudo ln -s /usr/lib64/libtree-sitter-bash.so.14 /usr/lib64/libtree-sitter-bash.so`
|
|
457
|
+
Add this to your shell profile (`.bashrc`, `.zshrc`, etc.) for persistence.
|
|
458
|
+
|
|
390
459
|
### 💎 Ruby Interface Gems
|
|
391
460
|
|
|
392
461
|
In addition to the tree-sitter parser library, you need a Ruby gem that provides
|
|
@@ -394,9 +463,9 @@ bindings to tree-sitter. Choose **one** of the following based on your Ruby impl
|
|
|
394
463
|
|
|
395
464
|
| Gem | Ruby Support | Description |
|
|
396
465
|
| --- | --- | --- |
|
|
397
|
-
| [ruby\_tree\_sitter]
|
|
398
|
-
| [tree\_stump]
|
|
399
|
-
| [ffi]
|
|
466
|
+
| [ruby\_tree\_sitter][ruby_tree_sitter] | MRI only | C extension bindings (recommended for MRI) |
|
|
467
|
+
| [tree\_stump][tree_stump] | MRI (maybe JRuby) | Rust-based bindings via Rutie |
|
|
468
|
+
| [ffi][ffi] | MRI, JRuby, TruffleRuby | Generic FFI bindings (used by tree\_haver's FFI backend) |
|
|
400
469
|
|
|
401
470
|
[ruby_tree_sitter]: https://github.com/Faveod/ruby_tree_sitter
|
|
402
471
|
[tree_stump]: https://github.com/nickstenning/tree_stump
|
|
@@ -404,25 +473,25 @@ bindings to tree-sitter. Choose **one** of the following based on your Ruby impl
|
|
|
404
473
|
|
|
405
474
|
#### For MRI Ruby (Recommended)
|
|
406
475
|
|
|
407
|
-
```
|
|
476
|
+
```console
|
|
408
477
|
gem install ruby_tree_sitter
|
|
409
478
|
```
|
|
410
479
|
|
|
411
480
|
Or add to your Gemfile:
|
|
412
481
|
|
|
413
|
-
```
|
|
482
|
+
```ruby
|
|
414
483
|
gem "ruby_tree_sitter", "~> 2.0"
|
|
415
484
|
```
|
|
416
485
|
|
|
417
486
|
#### For JRuby or TruffleRuby
|
|
418
487
|
|
|
419
|
-
```
|
|
488
|
+
```console
|
|
420
489
|
gem install ffi
|
|
421
490
|
```
|
|
422
491
|
|
|
423
492
|
Or add to your Gemfile:
|
|
424
493
|
|
|
425
|
-
```
|
|
494
|
+
```ruby
|
|
426
495
|
gem "ffi"
|
|
427
496
|
```
|
|
428
497
|
|
|
@@ -434,7 +503,7 @@ you must use the FFI backend.
|
|
|
434
503
|
|
|
435
504
|
## ⚙️ Configuration
|
|
436
505
|
|
|
437
|
-
```
|
|
506
|
+
```ruby
|
|
438
507
|
merger = Bash::Merge::SmartMerger.new(
|
|
439
508
|
template_content,
|
|
440
509
|
dest_content,
|
|
@@ -463,7 +532,7 @@ merger = Bash::Merge::SmartMerger.new(
|
|
|
463
532
|
|
|
464
533
|
### Simple Merge
|
|
465
534
|
|
|
466
|
-
```
|
|
535
|
+
```ruby
|
|
467
536
|
require "bash/merge"
|
|
468
537
|
|
|
469
538
|
# Template defines the structure
|
|
@@ -524,7 +593,7 @@ puts result.to_bash
|
|
|
524
593
|
|
|
525
594
|
Freeze blocks protect sections from being overwritten during merge:
|
|
526
595
|
|
|
527
|
-
```
|
|
596
|
+
```bash
|
|
528
597
|
#!/bin/bash
|
|
529
598
|
|
|
530
599
|
# Configuration
|
|
@@ -548,7 +617,7 @@ Content between `# bash-merge:freeze` and `# bash-merge:unfreeze` markers is pre
|
|
|
548
617
|
|
|
549
618
|
### Adding Template-Only Nodes
|
|
550
619
|
|
|
551
|
-
```
|
|
620
|
+
```ruby
|
|
552
621
|
merger = Bash::Merge::SmartMerger.new(
|
|
553
622
|
template,
|
|
554
623
|
destination,
|
|
@@ -565,17 +634,17 @@ Raising a monthly budget of... "dollars" would make the project more sustainable
|
|
|
565
634
|
|
|
566
635
|
We welcome both individual and corporate sponsors\! We also offer a
|
|
567
636
|
wide array of funding channels to account for your preferences
|
|
568
|
-
(although currently [Open Collective]
|
|
637
|
+
(although currently [Open Collective][🖇osc] is our preferred funding platform).
|
|
569
638
|
|
|
570
639
|
**If you're working in a company that's making significant use of kettle-rb tools we'd
|
|
571
640
|
appreciate it if you suggest to your company to become a kettle-rb sponsor.**
|
|
572
641
|
|
|
573
642
|
You can support the development of kettle-rb tools via
|
|
574
|
-
[GitHub Sponsors]
|
|
575
|
-
[Liberapay]
|
|
576
|
-
[PayPal]
|
|
577
|
-
[Open Collective]
|
|
578
|
-
and [Tidelift]
|
|
643
|
+
[GitHub Sponsors][🖇sponsor],
|
|
644
|
+
[Liberapay][⛳liberapay],
|
|
645
|
+
[PayPal][🖇paypal],
|
|
646
|
+
[Open Collective][🖇osc]
|
|
647
|
+
and [Tidelift][🏙️entsup-tidelift].
|
|
579
648
|
|
|
580
649
|
| 📍 NOTE |
|
|
581
650
|
| --- |
|
|
@@ -583,22 +652,26 @@ and [Tidelift](https://tidelift.com/subscription/pkg/rubygems-bash-merge?utm_sou
|
|
|
583
652
|
|
|
584
653
|
### Open Collective for Individuals
|
|
585
654
|
|
|
586
|
-
Support us with a monthly donation and help us continue our activities. \[[Become a backer]
|
|
655
|
+
Support us with a monthly donation and help us continue our activities. \[[Become a backer][🖇osc-backers]\]
|
|
587
656
|
|
|
588
|
-
NOTE: [kettle-readme-backers]
|
|
657
|
+
NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
|
|
589
658
|
|
|
590
659
|
<!-- OPENCOLLECTIVE-INDIVIDUALS:START -->
|
|
660
|
+
|
|
591
661
|
No backers yet. Be the first!
|
|
662
|
+
|
|
592
663
|
<!-- OPENCOLLECTIVE-INDIVIDUALS:END -->
|
|
593
664
|
|
|
594
665
|
### Open Collective for Organizations
|
|
595
666
|
|
|
596
|
-
Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor]
|
|
667
|
+
Become a sponsor and get your logo on our README on GitHub with a link to your site. \[[Become a sponsor][🖇osc-sponsors]\]
|
|
597
668
|
|
|
598
|
-
NOTE: [kettle-readme-backers]
|
|
669
|
+
NOTE: [kettle-readme-backers][kettle-readme-backers] updates this list every day, automatically.
|
|
599
670
|
|
|
600
671
|
<!-- OPENCOLLECTIVE-ORGANIZATIONS:START -->
|
|
672
|
+
|
|
601
673
|
No sponsors yet. Be the first!
|
|
674
|
+
|
|
602
675
|
<!-- OPENCOLLECTIVE-ORGANIZATIONS:END -->
|
|
603
676
|
|
|
604
677
|
[kettle-readme-backers]: https://github.com/kettle-rb/bash-merge/blob/main/exe/kettle-readme-backers
|
|
@@ -609,48 +682,49 @@ I’m driven by a passion to foster a thriving open-source community – a space
|
|
|
609
682
|
|
|
610
683
|
If you work at a company that uses my work, please encourage them to support me as a corporate sponsor. My work on gems you use might show up in `bundle fund`.
|
|
611
684
|
|
|
612
|
-
I’m developing a new library, [floss\_funding]
|
|
685
|
+
I’m developing a new library, [floss\_funding][🖇floss-funding-gem], designed to empower open-source developers like myself to get paid for the work we do, in a sustainable way. Please give it a look.
|
|
613
686
|
|
|
614
|
-
**[Floss-Funding.dev]
|
|
687
|
+
**[Floss-Funding.dev]
|
|
688
|
+
[🖇floss-funding.dev]: 👉️ No network calls. 👉️ No tracking. 👉️ No oversight. 👉️ Minimal crypto hashing. 💡 Easily disabled nags**
|
|
615
689
|
|
|
616
|
-
[![OpenCollective Backers]
|
|
690
|
+
[![OpenCollective Backers][🖇osc-backers-i]][🖇osc-backers] [![OpenCollective Sponsors][🖇osc-sponsors-i]][🖇osc-sponsors] [![Sponsor Me on Github][🖇sponsor-img]][🖇sponsor] [![Liberapay Goal Progress][⛳liberapay-img]][⛳liberapay] [![Donate on PayPal][🖇paypal-img]][🖇paypal] [![Buy me a coffee][🖇buyme-small-img]][🖇buyme] [![Donate on Polar][🖇polar-img]][🖇polar] [![Donate to my FLOSS efforts at ko-fi.com][🖇kofi-img]][🖇kofi] [![Donate to my FLOSS efforts using Patreon][🖇patreon-img]][🖇patreon]
|
|
617
691
|
|
|
618
692
|
## 🔐 Security
|
|
619
693
|
|
|
620
|
-
See [SECURITY.md]
|
|
694
|
+
See [SECURITY.md][🔐security].
|
|
621
695
|
|
|
622
696
|
## 🤝 Contributing
|
|
623
697
|
|
|
624
698
|
If you need some ideas of where to help, you could work on adding more code coverage,
|
|
625
|
-
or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues]
|
|
699
|
+
or if it is already 💯 (see [below](#code-coverage)) check [reek](REEK), [issues][🤝gh-issues], or [PRs][🤝gh-pulls],
|
|
626
700
|
or use the gem and think about how it could be better.
|
|
627
701
|
|
|
628
|
-
We [![Keep A Changelog]
|
|
702
|
+
We [![Keep A Changelog][📗keep-changelog-img]][📗keep-changelog] so if you make changes, remember to update it.
|
|
629
703
|
|
|
630
|
-
See [CONTRIBUTING.md]
|
|
704
|
+
See [CONTRIBUTING.md][🤝contributing] for more detailed instructions.
|
|
631
705
|
|
|
632
706
|
### 🚀 Release Instructions
|
|
633
707
|
|
|
634
|
-
See [CONTRIBUTING.md]
|
|
708
|
+
See [CONTRIBUTING.md][🤝contributing].
|
|
635
709
|
|
|
636
710
|
### Code Coverage
|
|
637
711
|
|
|
638
|
-
[![Coverage Graph]
|
|
712
|
+
[![Coverage Graph][🏀codecov-g]][🏀codecov]
|
|
639
713
|
|
|
640
|
-
[![Coveralls Test Coverage]
|
|
714
|
+
[![Coveralls Test Coverage][🏀coveralls-img]][🏀coveralls]
|
|
641
715
|
|
|
642
|
-
[![QLTY Test Coverage]
|
|
716
|
+
[![QLTY Test Coverage][🏀qlty-covi]][🏀qlty-cov]
|
|
643
717
|
|
|
644
718
|
### 🪇 Code of Conduct
|
|
645
719
|
|
|
646
720
|
Everyone interacting with this project's codebases, issue trackers,
|
|
647
|
-
chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1]
|
|
721
|
+
chat rooms and mailing lists agrees to follow the [![Contributor Covenant 2.1][🪇conduct-img]][🪇conduct].
|
|
648
722
|
|
|
649
723
|
## 🌈 Contributors
|
|
650
724
|
|
|
651
|
-
[![Contributors]
|
|
725
|
+
[![Contributors][🖐contributors-img]][🖐contributors]
|
|
652
726
|
|
|
653
|
-
Made with [contributors-img]
|
|
727
|
+
Made with [contributors-img][🖐contrib-rocks].
|
|
654
728
|
|
|
655
729
|
Also see GitLab Contributors: <https://gitlab.com/kettle-rb/bash-merge/-/graphs/main>
|
|
656
730
|
|
|
@@ -669,23 +743,23 @@ Also see GitLab Contributors: <https://gitlab.com/kettle-rb/bash-merge/-/graphs/
|
|
|
669
743
|
|
|
670
744
|
## 📌 Versioning
|
|
671
745
|
|
|
672
|
-
This Library adheres to [![Semantic Versioning 2.0.0]
|
|
746
|
+
This Library adheres to [![Semantic Versioning 2.0.0][📌semver-img]][📌semver].
|
|
673
747
|
Violations of this scheme should be reported as bugs.
|
|
674
748
|
Specifically, if a minor or patch version is released that breaks backward compatibility,
|
|
675
749
|
a new version should be immediately released that restores compatibility.
|
|
676
750
|
Breaking changes to the public API will only be introduced with new major versions.
|
|
677
751
|
|
|
678
752
|
> dropping support for a platform is both obviously and objectively a breaking change <br/>
|
|
679
|
-
> —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716]
|
|
753
|
+
> —Jordan Harband ([@ljharb](https://github.com/ljharb), maintainer of SemVer) [in SemVer issue 716][📌semver-breaking]
|
|
680
754
|
|
|
681
755
|
I understand that policy doesn't work universally ("exceptions to every rule\!"),
|
|
682
756
|
but it is the policy here.
|
|
683
757
|
As such, in many cases it is good to specify a dependency on this library using
|
|
684
|
-
the [Pessimistic Version Constraint]
|
|
758
|
+
the [Pessimistic Version Constraint][📌pvc] with two digits of precision.
|
|
685
759
|
|
|
686
760
|
For example:
|
|
687
761
|
|
|
688
|
-
```
|
|
762
|
+
```ruby
|
|
689
763
|
spec.add_dependency("bash-merge", "~> 1.0")
|
|
690
764
|
```
|
|
691
765
|
|
|
@@ -698,16 +772,17 @@ is a *breaking change* to an API, and for that reason the bike shedding is endle
|
|
|
698
772
|
To get a better understanding of how SemVer is intended to work over a project's lifetime,
|
|
699
773
|
read this article from the creator of SemVer:
|
|
700
774
|
|
|
701
|
-
|
|
775
|
+
- ["Major Version Numbers are Not Sacred"][📌major-versions-not-sacred]
|
|
776
|
+
|
|
702
777
|
</details>
|
|
703
778
|
|
|
704
|
-
See [CHANGELOG.md]
|
|
779
|
+
See [CHANGELOG.md][📌changelog] for a list of releases.
|
|
705
780
|
|
|
706
781
|
## 📄 License
|
|
707
782
|
|
|
708
783
|
The gem is available as open source under the terms of
|
|
709
|
-
the [MIT License]
|
|
710
|
-
See [LICENSE.txt]
|
|
784
|
+
the [MIT License][📄license] [![License: MIT][📄license-img]][📄license-ref].
|
|
785
|
+
See [LICENSE.txt][📄license] for the official [Copyright Notice][📄copyright-notice-explainer].
|
|
711
786
|
|
|
712
787
|
### © Copyright
|
|
713
788
|
|
|
@@ -734,11 +809,11 @@ Please consider sponsoring me or the project.
|
|
|
734
809
|
|
|
735
810
|
To join the community or get help 👇️ Join the Discord.
|
|
736
811
|
|
|
737
|
-
[![Live Chat on Discord]
|
|
812
|
+
[![Live Chat on Discord][✉️discord-invite-img-ftb]][🖼️galtzo-discord]
|
|
738
813
|
|
|
739
814
|
To say "thanks\!" ☝️ Join the Discord or 👇️ send money.
|
|
740
815
|
|
|
741
|
-
[![Sponsor kettle-rb/bash-merge on Open Source Collective]
|
|
816
|
+
[![Sponsor kettle-rb/bash-merge on Open Source Collective][🖇osc-all-bottom-img]][🖇osc] 💌 [![Sponsor me on GitHub Sponsors][🖇sponsor-bottom-img]][🖇sponsor] 💌 [![Sponsor me on Liberapay][⛳liberapay-bottom-img]][⛳liberapay] 💌 [![Donate on PayPal][🖇paypal-bottom-img]][🖇paypal]
|
|
742
817
|
|
|
743
818
|
### Please give the project a star ⭐ ♥.
|
|
744
819
|
|
|
@@ -779,7 +854,6 @@ Thanks for RTFM. ☺️
|
|
|
779
854
|
[✉️discord-invite-img-ftb]: https://img.shields.io/discord/1373797679469170758?style=for-the-badge&logo=discord
|
|
780
855
|
[✉️ruby-friends-img]: https://img.shields.io/badge/daily.dev-%F0%9F%92%8E_Ruby_Friends-0A0A0A?style=for-the-badge&logo=dailydotdev&logoColor=white
|
|
781
856
|
[✉️ruby-friends]: https://app.daily.dev/squads/rubyfriends
|
|
782
|
-
|
|
783
857
|
[✇bundle-group-pattern]: https://gist.github.com/pboling/4564780
|
|
784
858
|
[⛳️gem-namespace]: https://github.com/kettle-rb/bash-merge
|
|
785
859
|
[⛳️namespace-img]: https://img.shields.io/badge/namespace-Bash::Merge-3C2D2D.svg?style=square&logo=ruby&logoColor=white
|
|
@@ -903,7 +977,7 @@ Thanks for RTFM. ☺️
|
|
|
903
977
|
[📌gitmoji]: https://gitmoji.dev
|
|
904
978
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
905
979
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
906
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.
|
|
980
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.521-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
907
981
|
[🔐security]: SECURITY.md
|
|
908
982
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
909
983
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -923,6 +997,3 @@ Thanks for RTFM. ☺️
|
|
|
923
997
|
[💎appraisal2]: https://github.com/appraisal-rb/appraisal2
|
|
924
998
|
[💎appraisal2-img]: https://img.shields.io/badge/appraised_by-appraisal2-34495e.svg?plastic&logo=ruby&logoColor=white
|
|
925
999
|
[💎d-in-dvcs]: https://railsbling.com/posts/dvcs/put_the_d_in_dvcs/
|
|
926
|
-
|
|
927
|
-
[ts-jsonc]: https://gitlab.com/WhyNotHugo/tree-sitter-jsonc
|
|
928
|
-
[dotenv]: https://github.com/bkeepers/dotenv
|
data/lib/bash/merge/version.rb
CHANGED
data/lib/bash/merge.rb
CHANGED
|
@@ -113,6 +113,18 @@ module Bash
|
|
|
113
113
|
end
|
|
114
114
|
end
|
|
115
115
|
|
|
116
|
+
# Register with ast-merge's MergeGemRegistry for RSpec dependency tags
|
|
117
|
+
# Only register if MergeGemRegistry is loaded (i.e., in test environment)
|
|
118
|
+
if defined?(Ast::Merge::RSpec::MergeGemRegistry)
|
|
119
|
+
Ast::Merge::RSpec::MergeGemRegistry.register(
|
|
120
|
+
:bash_merge,
|
|
121
|
+
require_path: "bash/merge",
|
|
122
|
+
merger_class: "Bash::Merge::SmartMerger",
|
|
123
|
+
test_source: "#!/bin/bash\necho hello",
|
|
124
|
+
category: :code,
|
|
125
|
+
)
|
|
126
|
+
end
|
|
127
|
+
|
|
116
128
|
Bash::Merge::Version.class_eval do
|
|
117
129
|
extend VersionGem::Basic
|
|
118
130
|
end
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bash-merge
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -43,40 +43,40 @@ dependencies:
|
|
|
43
43
|
requirements:
|
|
44
44
|
- - "~>"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
46
|
+
version: '5.0'
|
|
47
47
|
- - ">="
|
|
48
48
|
- !ruby/object:Gem::Version
|
|
49
|
-
version:
|
|
49
|
+
version: 5.0.1
|
|
50
50
|
type: :runtime
|
|
51
51
|
prerelease: false
|
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
|
53
53
|
requirements:
|
|
54
54
|
- - "~>"
|
|
55
55
|
- !ruby/object:Gem::Version
|
|
56
|
-
version: '
|
|
56
|
+
version: '5.0'
|
|
57
57
|
- - ">="
|
|
58
58
|
- !ruby/object:Gem::Version
|
|
59
|
-
version:
|
|
59
|
+
version: 5.0.1
|
|
60
60
|
- !ruby/object:Gem::Dependency
|
|
61
61
|
name: ast-merge
|
|
62
62
|
requirement: !ruby/object:Gem::Requirement
|
|
63
63
|
requirements:
|
|
64
64
|
- - "~>"
|
|
65
65
|
- !ruby/object:Gem::Version
|
|
66
|
-
version: '
|
|
66
|
+
version: '4.0'
|
|
67
67
|
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version:
|
|
69
|
+
version: 4.0.2
|
|
70
70
|
type: :runtime
|
|
71
71
|
prerelease: false
|
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
|
73
73
|
requirements:
|
|
74
74
|
- - "~>"
|
|
75
75
|
- !ruby/object:Gem::Version
|
|
76
|
-
version: '
|
|
76
|
+
version: '4.0'
|
|
77
77
|
- - ">="
|
|
78
78
|
- !ruby/object:Gem::Version
|
|
79
|
-
version:
|
|
79
|
+
version: 4.0.2
|
|
80
80
|
- !ruby/object:Gem::Dependency
|
|
81
81
|
name: version_gem
|
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -315,10 +315,10 @@ licenses:
|
|
|
315
315
|
- MIT
|
|
316
316
|
metadata:
|
|
317
317
|
homepage_uri: https://bash-merge.galtzo.com/
|
|
318
|
-
source_code_uri: https://github.com/kettle-rb/bash-merge/tree/v2.0.
|
|
319
|
-
changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v2.0.
|
|
318
|
+
source_code_uri: https://github.com/kettle-rb/bash-merge/tree/v2.0.3
|
|
319
|
+
changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v2.0.3/CHANGELOG.md
|
|
320
320
|
bug_tracker_uri: https://github.com/kettle-rb/bash-merge/issues
|
|
321
|
-
documentation_uri: https://www.rubydoc.info/gems/bash-merge/2.0.
|
|
321
|
+
documentation_uri: https://www.rubydoc.info/gems/bash-merge/2.0.3
|
|
322
322
|
funding_uri: https://github.com/sponsors/pboling
|
|
323
323
|
wiki_uri: https://github.com/kettle-rb/bash-merge/wiki
|
|
324
324
|
news_uri: https://www.railsbling.com/tags/bash-merge
|
metadata.gz.sig
CHANGED
|
Binary file
|