bash-merge 2.0.4 → 2.0.5
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 +19 -1
- data/README.md +16 -16
- data/lib/bash/merge/conflict_resolver.rb +40 -7
- data/lib/bash/merge/smart_merger.rb +1 -0
- data/lib/bash/merge/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +9 -9
- 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: 143070616b47ff572ec71a20ce9e8be2549fbdaac8e00fb703de16598b143770
|
|
4
|
+
data.tar.gz: e11406b8fc7e8adf42b5f473c22fa5761e46ed13a300715b3012765753e1b472
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fb3bd78f3e13caddb7eee63fd32fa62d180ee99ede3d2a138ceb125e23df5ceb3e93dc2393413efc3fb5d3c38faa7136aca9584357ef1e85f435f315d99574ba
|
|
7
|
+
data.tar.gz: a1c7c1cf94ae0c103993356d525418384a6d2f13d5c878800487cd1839a3ce3e52206e9abb2b6b3ff8ba603dbe50af6c6eca75decc0e8b1ce3b06519ba1448e6
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,22 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [2.0.5] - 2026-02-01
|
|
34
|
+
|
|
35
|
+
- TAG: [v2.0.5][2.0.5t]
|
|
36
|
+
- COVERAGE: 96.10% -- 518/539 lines in 11 files
|
|
37
|
+
- BRANCH COVERAGE: 74.72% -- 133/178 branches in 11 files
|
|
38
|
+
- 96.33% documented
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- ConflictResolver now applies per-node-type preferences via `node_typing`.
|
|
43
|
+
|
|
44
|
+
### Changed
|
|
45
|
+
|
|
46
|
+
- tree_haver v5.0.3
|
|
47
|
+
- ast-merge v4.0.5
|
|
48
|
+
|
|
33
49
|
## [2.0.4] - 2026-01-20
|
|
34
50
|
|
|
35
51
|
- TAG: [v2.0.4][2.0.4t]
|
|
@@ -149,7 +165,9 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
149
165
|
|
|
150
166
|
### Security
|
|
151
167
|
|
|
152
|
-
[Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.
|
|
168
|
+
[Unreleased]: https://github.com/kettle-rb/bash-merge/compare/v2.0.5...HEAD
|
|
169
|
+
[2.0.5]: https://github.com/kettle-rb/bash-merge/compare/v2.0.4...v2.0.5
|
|
170
|
+
[2.0.5t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.5
|
|
153
171
|
[2.0.4]: https://github.com/kettle-rb/bash-merge/compare/v2.0.3...v2.0.4
|
|
154
172
|
[2.0.4t]: https://github.com/kettle-rb/bash-merge/releases/tag/v2.0.4
|
|
155
173
|
[2.0.3]: https://github.com/kettle-rb/bash-merge/compare/v2.0.2...v2.0.3
|
data/README.md
CHANGED
|
@@ -104,21 +104,21 @@ File.write("merged.sh", result.to_bash)
|
|
|
104
104
|
|
|
105
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.
|
|
106
106
|
|
|
107
|
-
| Gem |
|
|
108
|
-
|
|
109
|
-
| [tree_haver][tree_haver] |
|
|
110
|
-
| [ast-merge][ast-merge] |
|
|
111
|
-
| [bash-merge][bash-merge] |
|
|
112
|
-
| [commonmarker-merge][commonmarker-merge] | [![Version][commonmarker-merge-gem-i]][commonmarker-merge-gem]
|
|
113
|
-
| [dotenv-merge][dotenv-merge] |
|
|
114
|
-
| [json-merge][json-merge] |
|
|
115
|
-
| [jsonc-merge][jsonc-merge] |
|
|
116
|
-
| [markdown-merge][markdown-merge] |
|
|
117
|
-
| [markly-merge][markly-merge] |
|
|
118
|
-
| [prism-merge][prism-merge] |
|
|
119
|
-
| [psych-merge][psych-merge] |
|
|
120
|
-
| [rbs-merge][rbs-merge] |
|
|
121
|
-
| [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] <br/> [![CI][tree_haver-ci-i]][tree_haver-ci] | Multi | Supported Backends: 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] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][markdown-merge-ci-i]][markdown-merge-ci] | Markdown | [Commonmarker][commonmarker] / [Markly][markly] (via tree_haver), [Parslet][parslet] | **Foundation**: Shared base for Markdown mergers with inner code block merging |
|
|
117
|
+
| [markly-merge][markly-merge] | [![Version][markly-merge-gem-i]][markly-merge-gem] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][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] <br/> [![CI][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 |
|
|
122
122
|
|
|
123
123
|
#### Backend Platform Compatibility
|
|
124
124
|
|
|
@@ -976,7 +976,7 @@ Thanks for RTFM. ☺️
|
|
|
976
976
|
[📌gitmoji]: https://gitmoji.dev
|
|
977
977
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
978
978
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
979
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.
|
|
979
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-0.539-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
980
980
|
[🔐security]: SECURITY.md
|
|
981
981
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
982
982
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -13,14 +13,16 @@ module Bash
|
|
|
13
13
|
#
|
|
14
14
|
# @param template_analysis [FileAnalysis] Analyzed template file
|
|
15
15
|
# @param dest_analysis [FileAnalysis] Analyzed destination file
|
|
16
|
-
# @param preference [Symbol] Which version to prefer when
|
|
16
|
+
# @param preference [Symbol, Hash] Which version to prefer when
|
|
17
17
|
# nodes have matching signatures:
|
|
18
18
|
# - :destination (default) - Keep destination version (customizations)
|
|
19
19
|
# - :template - Use template version (updates)
|
|
20
20
|
# @param add_template_only_nodes [Boolean] Whether to add nodes only in template
|
|
21
21
|
# @param match_refiner [#call, nil] Optional match refiner for fuzzy matching
|
|
22
22
|
# @param options [Hash] Additional options for forward compatibility
|
|
23
|
-
|
|
23
|
+
# @param node_typing [Hash{Symbol,String => #call}, nil] Node typing configuration
|
|
24
|
+
# for per-node-type preferences
|
|
25
|
+
def initialize(template_analysis, dest_analysis, preference: :destination, add_template_only_nodes: false, match_refiner: nil, node_typing: nil, **options)
|
|
24
26
|
super(
|
|
25
27
|
strategy: :batch,
|
|
26
28
|
preference: preference,
|
|
@@ -30,6 +32,7 @@ module Bash
|
|
|
30
32
|
match_refiner: match_refiner,
|
|
31
33
|
**options
|
|
32
34
|
)
|
|
35
|
+
@node_typing = node_typing
|
|
33
36
|
@emitter = Emitter.new
|
|
34
37
|
end
|
|
35
38
|
|
|
@@ -98,11 +101,7 @@ module Bash
|
|
|
98
101
|
template_node = template_info[:node]
|
|
99
102
|
|
|
100
103
|
# Decide which to emit based on preference
|
|
101
|
-
|
|
102
|
-
emit_node(dest_node, @dest_analysis)
|
|
103
|
-
else
|
|
104
|
-
emit_node(template_node, @template_analysis)
|
|
105
|
-
end
|
|
104
|
+
emit_preferred_node(template_node, dest_node)
|
|
106
105
|
|
|
107
106
|
processed_dest_sigs << dest_sig
|
|
108
107
|
processed_template_sigs << dest_sig
|
|
@@ -131,6 +130,40 @@ module Bash
|
|
|
131
130
|
end
|
|
132
131
|
end
|
|
133
132
|
|
|
133
|
+
def emit_preferred_node(template_node, dest_node)
|
|
134
|
+
if preference_for_pair(template_node, dest_node) == :destination
|
|
135
|
+
emit_node(dest_node, @dest_analysis)
|
|
136
|
+
else
|
|
137
|
+
emit_node(template_node, @template_analysis)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def preference_for_pair(template_node, dest_node)
|
|
142
|
+
return @preference unless @preference.is_a?(Hash)
|
|
143
|
+
|
|
144
|
+
typed_template = apply_node_typing(template_node)
|
|
145
|
+
typed_dest = apply_node_typing(dest_node)
|
|
146
|
+
|
|
147
|
+
if Ast::Merge::NodeTyping.typed_node?(typed_template)
|
|
148
|
+
merge_type = Ast::Merge::NodeTyping.merge_type_for(typed_template)
|
|
149
|
+
return @preference.fetch(merge_type) { default_preference } if merge_type
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
if Ast::Merge::NodeTyping.typed_node?(typed_dest)
|
|
153
|
+
merge_type = Ast::Merge::NodeTyping.merge_type_for(typed_dest)
|
|
154
|
+
return @preference.fetch(merge_type) { default_preference } if merge_type
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
default_preference
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def apply_node_typing(node)
|
|
161
|
+
return node unless @node_typing
|
|
162
|
+
return node unless node
|
|
163
|
+
|
|
164
|
+
Ast::Merge::NodeTyping.process(node, @node_typing)
|
|
165
|
+
end
|
|
166
|
+
|
|
134
167
|
# Emit a single node to the emitter
|
|
135
168
|
# @param node [NodeWrapper] Node to emit
|
|
136
169
|
# @param analysis [FileAnalysis] Analysis for accessing source
|
data/lib/bash/merge/version.rb
CHANGED
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.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -46,7 +46,7 @@ dependencies:
|
|
|
46
46
|
version: '5.0'
|
|
47
47
|
- - ">="
|
|
48
48
|
- !ruby/object:Gem::Version
|
|
49
|
-
version: 5.0.
|
|
49
|
+
version: 5.0.3
|
|
50
50
|
type: :runtime
|
|
51
51
|
prerelease: false
|
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -56,7 +56,7 @@ dependencies:
|
|
|
56
56
|
version: '5.0'
|
|
57
57
|
- - ">="
|
|
58
58
|
- !ruby/object:Gem::Version
|
|
59
|
-
version: 5.0.
|
|
59
|
+
version: 5.0.3
|
|
60
60
|
- !ruby/object:Gem::Dependency
|
|
61
61
|
name: ast-merge
|
|
62
62
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -66,7 +66,7 @@ dependencies:
|
|
|
66
66
|
version: '4.0'
|
|
67
67
|
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 4.0.
|
|
69
|
+
version: 4.0.5
|
|
70
70
|
type: :runtime
|
|
71
71
|
prerelease: false
|
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -76,7 +76,7 @@ dependencies:
|
|
|
76
76
|
version: '4.0'
|
|
77
77
|
- - ">="
|
|
78
78
|
- !ruby/object:Gem::Version
|
|
79
|
-
version: 4.0.
|
|
79
|
+
version: 4.0.5
|
|
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.5
|
|
319
|
+
changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v2.0.5/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.5
|
|
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
|
|
@@ -347,7 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
347
347
|
- !ruby/object:Gem::Version
|
|
348
348
|
version: '0'
|
|
349
349
|
requirements: []
|
|
350
|
-
rubygems_version: 4.0.
|
|
350
|
+
rubygems_version: 4.0.5
|
|
351
351
|
specification_version: 4
|
|
352
352
|
summary: "☯️ Intelligent Bash script merging using tree-sitter AST analysis"
|
|
353
353
|
test_files: []
|
metadata.gz.sig
CHANGED
|
Binary file
|