bash-merge 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +48 -0
- data/CITATION.cff +20 -0
- data/CODE_OF_CONDUCT.md +134 -0
- data/CONTRIBUTING.md +227 -0
- data/FUNDING.md +74 -0
- data/LICENSE.txt +21 -0
- data/README.md +900 -0
- data/REEK +0 -0
- data/RUBOCOP.md +71 -0
- data/SECURITY.md +21 -0
- data/lib/bash/merge/comment_tracker.rb +153 -0
- data/lib/bash/merge/conflict_resolver.rb +161 -0
- data/lib/bash/merge/debug_logger.rb +43 -0
- data/lib/bash/merge/emitter.rb +218 -0
- data/lib/bash/merge/file_analysis.rb +247 -0
- data/lib/bash/merge/freeze_node.rb +101 -0
- data/lib/bash/merge/merge_result.rb +142 -0
- data/lib/bash/merge/node_wrapper.rb +342 -0
- data/lib/bash/merge/smart_merger.rb +188 -0
- data/lib/bash/merge/version.rb +12 -0
- data/lib/bash/merge.rb +129 -0
- data/lib/bash-merge.rb +6 -0
- data/sig/bash/merge.rbs +260 -0
- data.tar.gz.sig +0 -0
- metadata +353 -0
- metadata.gz.sig +3 -0
data/sig/bash/merge.rbs
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
# Type signatures for bash-merge gem
|
|
2
|
+
# Smart merge for Bash scripts using tree-sitter AST analysis
|
|
3
|
+
|
|
4
|
+
module Bash
|
|
5
|
+
module Merge
|
|
6
|
+
VERSION: String
|
|
7
|
+
|
|
8
|
+
# Base error class for bash-merge errors
|
|
9
|
+
class Error < StandardError
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Error raised when template Bash file has syntax errors
|
|
13
|
+
class TemplateParseError < Error
|
|
14
|
+
attr_reader errors: Array[untyped]
|
|
15
|
+
attr_reader content: String?
|
|
16
|
+
|
|
17
|
+
def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Error raised when destination Bash file has syntax errors
|
|
21
|
+
class DestinationParseError < Error
|
|
22
|
+
attr_reader errors: Array[untyped]
|
|
23
|
+
attr_reader content: String?
|
|
24
|
+
|
|
25
|
+
def initialize: (?String? message, ?errors: Array[untyped], ?content: String?) -> void
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Debug logging utility for Bash::Merge
|
|
29
|
+
module DebugLogger
|
|
30
|
+
extend Ast::Merge::DebugLogger
|
|
31
|
+
|
|
32
|
+
def self.env_var_name: () -> String
|
|
33
|
+
def self.env_var_name=: (String name) -> String
|
|
34
|
+
def self.log_prefix: () -> String
|
|
35
|
+
def self.log_prefix=: (String prefix) -> String
|
|
36
|
+
def self.enabled?: () -> bool
|
|
37
|
+
def self.debug: (String message, ?Hash[Symbol, untyped] context) -> void
|
|
38
|
+
def self.info: (String message) -> void
|
|
39
|
+
def self.warning: (String message) -> void
|
|
40
|
+
def self.time: [T] (String operation) { () -> T } -> T
|
|
41
|
+
def self.extract_node_info: (untyped node) -> Hash[Symbol, untyped]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Freeze block node for Bash scripts
|
|
45
|
+
class FreezeNode < Ast::Merge::FreezeNode
|
|
46
|
+
InvalidStructureError: singleton(Ast::Merge::FreezeNode::InvalidStructureError)
|
|
47
|
+
Location: singleton(Ast::Merge::FreezeNode::Location)
|
|
48
|
+
|
|
49
|
+
attr_reader lines: Array[String]
|
|
50
|
+
|
|
51
|
+
def initialize: (
|
|
52
|
+
start_line: Integer,
|
|
53
|
+
end_line: Integer,
|
|
54
|
+
lines: Array[String],
|
|
55
|
+
?start_marker: String?,
|
|
56
|
+
?end_marker: String?,
|
|
57
|
+
?pattern_type: Symbol
|
|
58
|
+
) -> void
|
|
59
|
+
|
|
60
|
+
def signature: () -> Array[Symbol | String]
|
|
61
|
+
def function_definition?: () -> bool
|
|
62
|
+
def variable_assignment?: () -> bool
|
|
63
|
+
def command?: () -> bool
|
|
64
|
+
def slice: () -> String?
|
|
65
|
+
def inspect: () -> String
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def validate_structure!: () -> void
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Wrapper for tree-sitter Bash nodes
|
|
73
|
+
class NodeWrapper
|
|
74
|
+
attr_reader node: untyped
|
|
75
|
+
attr_reader start_line: Integer
|
|
76
|
+
attr_reader end_line: Integer
|
|
77
|
+
attr_reader source: String
|
|
78
|
+
attr_reader analysis: FileAnalysis?
|
|
79
|
+
|
|
80
|
+
def initialize: (
|
|
81
|
+
untyped node,
|
|
82
|
+
String source,
|
|
83
|
+
?analysis: FileAnalysis?
|
|
84
|
+
) -> void
|
|
85
|
+
|
|
86
|
+
def location: () -> Ast::Merge::FreezeNode::Location
|
|
87
|
+
def signature: () -> Array[untyped]
|
|
88
|
+
def freeze_node?: () -> bool
|
|
89
|
+
def function_definition?: () -> bool
|
|
90
|
+
def variable_assignment?: () -> bool
|
|
91
|
+
def command?: () -> bool
|
|
92
|
+
def comment?: () -> bool
|
|
93
|
+
def name: () -> String?
|
|
94
|
+
def value: () -> String?
|
|
95
|
+
def slice: () -> String?
|
|
96
|
+
def text: () -> String
|
|
97
|
+
def type: () -> Symbol
|
|
98
|
+
def inspect: () -> String
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Comment tracker for Bash files
|
|
102
|
+
class CommentTracker
|
|
103
|
+
attr_reader comments: Array[Hash[Symbol, untyped]]
|
|
104
|
+
attr_reader source: String
|
|
105
|
+
attr_reader lines: Array[String]
|
|
106
|
+
|
|
107
|
+
def initialize: (String source) -> void
|
|
108
|
+
|
|
109
|
+
def extract_comments: () -> Array[Hash[Symbol, untyped]]
|
|
110
|
+
def comments_for_line: (Integer line) -> Array[Hash[Symbol, untyped]]
|
|
111
|
+
def leading_comments_for: (Integer line) -> Array[Hash[Symbol, untyped]]
|
|
112
|
+
def trailing_comment_for: (Integer line) -> Hash[Symbol, untyped]?
|
|
113
|
+
def shebang?: (String line) -> bool
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# File analysis for Bash scripts
|
|
117
|
+
class FileAnalysis
|
|
118
|
+
include Ast::Merge::FileAnalysisBase
|
|
119
|
+
|
|
120
|
+
DEFAULT_FREEZE_TOKEN: String
|
|
121
|
+
PARSER_SEARCH_PATHS: Array[String]
|
|
122
|
+
|
|
123
|
+
attr_reader source: String
|
|
124
|
+
attr_reader lines: Array[String]
|
|
125
|
+
attr_reader ast: untyped
|
|
126
|
+
attr_reader statements: Array[NodeWrapper | FreezeNode]
|
|
127
|
+
attr_reader freeze_blocks: Array[FreezeNode]
|
|
128
|
+
attr_reader freeze_token: String
|
|
129
|
+
attr_reader signature_generator: (^(untyped) -> Array[untyped]?)?
|
|
130
|
+
attr_reader comment_tracker: CommentTracker
|
|
131
|
+
attr_reader errors: Array[untyped]
|
|
132
|
+
|
|
133
|
+
def self.find_parser_path: () -> String?
|
|
134
|
+
|
|
135
|
+
def initialize: (
|
|
136
|
+
String source,
|
|
137
|
+
?freeze_token: String,
|
|
138
|
+
?signature_generator: (^(untyped) -> Array[untyped]?)?,
|
|
139
|
+
?parser_path: String?
|
|
140
|
+
) -> void
|
|
141
|
+
|
|
142
|
+
def valid?: () -> bool
|
|
143
|
+
def nodes: () -> Array[NodeWrapper | FreezeNode]
|
|
144
|
+
def line_at: (Integer line_num) -> String?
|
|
145
|
+
def normalized_line: (Integer line_num) -> String?
|
|
146
|
+
def in_freeze_block?: (Integer line_num) -> bool
|
|
147
|
+
def freeze_block_at: (Integer line_num) -> FreezeNode?
|
|
148
|
+
def signature_at: (Integer index) -> Array[untyped]?
|
|
149
|
+
def generate_signature: (untyped node) -> Array[untyped]?
|
|
150
|
+
def compute_node_signature: (untyped node) -> Array[untyped]?
|
|
151
|
+
|
|
152
|
+
private
|
|
153
|
+
|
|
154
|
+
def parse_bash: () -> void
|
|
155
|
+
def extract_nodes: (untyped tree_node) -> Array[NodeWrapper]
|
|
156
|
+
def extract_freeze_blocks: () -> Array[FreezeNode]
|
|
157
|
+
def integrate_nodes_and_freeze_blocks: () -> Array[NodeWrapper | FreezeNode]
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Result of a Bash merge operation
|
|
161
|
+
class MergeResult < Ast::Merge::MergeResult
|
|
162
|
+
DECISION_KEPT_TEMPLATE: Symbol
|
|
163
|
+
DECISION_KEPT_DEST: Symbol
|
|
164
|
+
DECISION_MERGED: Symbol
|
|
165
|
+
DECISION_ADDED: Symbol
|
|
166
|
+
DECISION_FREEZE_BLOCK: Symbol
|
|
167
|
+
|
|
168
|
+
attr_reader lines: Array[Hash[Symbol, untyped]]
|
|
169
|
+
attr_reader decisions: Array[Hash[Symbol, untyped]]
|
|
170
|
+
attr_reader statistics: Hash[Symbol, Integer]
|
|
171
|
+
|
|
172
|
+
def initialize: (
|
|
173
|
+
?template_analysis: FileAnalysis?,
|
|
174
|
+
?dest_analysis: FileAnalysis?,
|
|
175
|
+
?conflicts: Array[Hash[Symbol, untyped]],
|
|
176
|
+
?frozen_blocks: Array[FreezeNode],
|
|
177
|
+
?stats: Hash[Symbol, untyped]
|
|
178
|
+
) -> void
|
|
179
|
+
|
|
180
|
+
def add_line: (
|
|
181
|
+
String line,
|
|
182
|
+
decision: Symbol,
|
|
183
|
+
source: Symbol,
|
|
184
|
+
?original_line: Integer?
|
|
185
|
+
) -> void
|
|
186
|
+
|
|
187
|
+
def add_lines: (
|
|
188
|
+
Array[String] lines,
|
|
189
|
+
decision: Symbol,
|
|
190
|
+
source: Symbol,
|
|
191
|
+
?start_line: Integer?
|
|
192
|
+
) -> void
|
|
193
|
+
|
|
194
|
+
def add_blank_line: (?decision: Symbol, ?source: Symbol) -> void
|
|
195
|
+
def add_freeze_block: (FreezeNode freeze_node) -> void
|
|
196
|
+
def to_bash: () -> String
|
|
197
|
+
def content: () -> Array[Hash[Symbol, untyped]]
|
|
198
|
+
def content_string: () -> String
|
|
199
|
+
def empty?: () -> bool
|
|
200
|
+
|
|
201
|
+
private
|
|
202
|
+
|
|
203
|
+
def track_statistics: (Symbol decision, Symbol source) -> void
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# Smart merger for Bash scripts
|
|
207
|
+
class SmartMerger
|
|
208
|
+
include Ast::Merge::MergerConfig
|
|
209
|
+
|
|
210
|
+
attr_reader template_analysis: FileAnalysis
|
|
211
|
+
attr_reader dest_analysis: FileAnalysis
|
|
212
|
+
attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
|
|
213
|
+
attr_reader add_template_only_nodes: bool
|
|
214
|
+
|
|
215
|
+
def initialize: (
|
|
216
|
+
String template_content,
|
|
217
|
+
String dest_content,
|
|
218
|
+
?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
|
|
219
|
+
?add_template_only_nodes: bool,
|
|
220
|
+
?freeze_token: String,
|
|
221
|
+
?signature_generator: (^(untyped) -> Array[untyped]?)?,
|
|
222
|
+
?node_splitter: Hash[Symbol, untyped]?,
|
|
223
|
+
?parser_path: String?
|
|
224
|
+
) -> void
|
|
225
|
+
|
|
226
|
+
def merge: () -> MergeResult
|
|
227
|
+
|
|
228
|
+
private
|
|
229
|
+
|
|
230
|
+
def perform_merge: () -> MergeResult
|
|
231
|
+
def merge_nodes: (MergeResult result) -> void
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# Conflict resolver for Bash merges
|
|
235
|
+
class ConflictResolver
|
|
236
|
+
attr_reader template_analysis: FileAnalysis
|
|
237
|
+
attr_reader dest_analysis: FileAnalysis
|
|
238
|
+
attr_reader signature_match_preference: (Symbol | Hash[Symbol, Symbol])
|
|
239
|
+
attr_reader add_template_only_nodes: bool
|
|
240
|
+
|
|
241
|
+
def initialize: (
|
|
242
|
+
FileAnalysis template_analysis,
|
|
243
|
+
FileAnalysis dest_analysis,
|
|
244
|
+
?signature_match_preference: (Symbol | Hash[Symbol, Symbol]),
|
|
245
|
+
?add_template_only_nodes: bool
|
|
246
|
+
) -> void
|
|
247
|
+
|
|
248
|
+
def resolve: (untyped boundary, MergeResult result) -> void
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Emitter for reconstructing Bash output
|
|
252
|
+
class Emitter
|
|
253
|
+
attr_reader result: MergeResult
|
|
254
|
+
|
|
255
|
+
def initialize: (MergeResult result) -> void
|
|
256
|
+
|
|
257
|
+
def emit: () -> String
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
data.tar.gz.sig
ADDED
|
Binary file
|
metadata
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: bash-merge
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Peter H. Boling
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain:
|
|
10
|
+
- |
|
|
11
|
+
-----BEGIN CERTIFICATE-----
|
|
12
|
+
MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
|
|
13
|
+
ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
|
|
14
|
+
A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
|
|
15
|
+
DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
|
16
|
+
LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
|
|
17
|
+
uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
|
|
18
|
+
LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
|
|
19
|
+
mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
|
|
20
|
+
coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
|
|
21
|
+
FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
|
|
22
|
+
yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
|
|
23
|
+
to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
|
|
24
|
+
qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
|
|
25
|
+
fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
|
|
26
|
+
HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
|
|
27
|
+
A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
|
|
28
|
+
ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
|
|
29
|
+
wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
|
|
30
|
+
L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
|
|
31
|
+
GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
|
|
32
|
+
kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
|
|
33
|
+
QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
|
|
34
|
+
0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
|
|
35
|
+
DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
|
|
36
|
+
L9nRqA==
|
|
37
|
+
-----END CERTIFICATE-----
|
|
38
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
39
|
+
dependencies:
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: tree_haver
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '3.2'
|
|
47
|
+
- - ">="
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: 3.2.2
|
|
50
|
+
type: :runtime
|
|
51
|
+
prerelease: false
|
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
53
|
+
requirements:
|
|
54
|
+
- - "~>"
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: '3.2'
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: 3.2.2
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: ast-merge
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - "~>"
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '2.0'
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: 2.0.6
|
|
70
|
+
type: :runtime
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - "~>"
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '2.0'
|
|
77
|
+
- - ">="
|
|
78
|
+
- !ruby/object:Gem::Version
|
|
79
|
+
version: 2.0.6
|
|
80
|
+
- !ruby/object:Gem::Dependency
|
|
81
|
+
name: version_gem
|
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
|
83
|
+
requirements:
|
|
84
|
+
- - "~>"
|
|
85
|
+
- !ruby/object:Gem::Version
|
|
86
|
+
version: '1.1'
|
|
87
|
+
- - ">="
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: 1.1.9
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '1.1'
|
|
97
|
+
- - ">="
|
|
98
|
+
- !ruby/object:Gem::Version
|
|
99
|
+
version: 1.1.9
|
|
100
|
+
- !ruby/object:Gem::Dependency
|
|
101
|
+
name: kettle-dev
|
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
|
103
|
+
requirements:
|
|
104
|
+
- - "~>"
|
|
105
|
+
- !ruby/object:Gem::Version
|
|
106
|
+
version: '1.1'
|
|
107
|
+
type: :development
|
|
108
|
+
prerelease: false
|
|
109
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
110
|
+
requirements:
|
|
111
|
+
- - "~>"
|
|
112
|
+
- !ruby/object:Gem::Version
|
|
113
|
+
version: '1.1'
|
|
114
|
+
- !ruby/object:Gem::Dependency
|
|
115
|
+
name: bundler-audit
|
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
|
117
|
+
requirements:
|
|
118
|
+
- - "~>"
|
|
119
|
+
- !ruby/object:Gem::Version
|
|
120
|
+
version: 0.9.2
|
|
121
|
+
type: :development
|
|
122
|
+
prerelease: false
|
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
124
|
+
requirements:
|
|
125
|
+
- - "~>"
|
|
126
|
+
- !ruby/object:Gem::Version
|
|
127
|
+
version: 0.9.2
|
|
128
|
+
- !ruby/object:Gem::Dependency
|
|
129
|
+
name: rake
|
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
|
131
|
+
requirements:
|
|
132
|
+
- - "~>"
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: '13.0'
|
|
135
|
+
type: :development
|
|
136
|
+
prerelease: false
|
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
138
|
+
requirements:
|
|
139
|
+
- - "~>"
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: '13.0'
|
|
142
|
+
- !ruby/object:Gem::Dependency
|
|
143
|
+
name: require_bench
|
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
|
145
|
+
requirements:
|
|
146
|
+
- - "~>"
|
|
147
|
+
- !ruby/object:Gem::Version
|
|
148
|
+
version: '1.0'
|
|
149
|
+
- - ">="
|
|
150
|
+
- !ruby/object:Gem::Version
|
|
151
|
+
version: 1.0.4
|
|
152
|
+
type: :development
|
|
153
|
+
prerelease: false
|
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
155
|
+
requirements:
|
|
156
|
+
- - "~>"
|
|
157
|
+
- !ruby/object:Gem::Version
|
|
158
|
+
version: '1.0'
|
|
159
|
+
- - ">="
|
|
160
|
+
- !ruby/object:Gem::Version
|
|
161
|
+
version: 1.0.4
|
|
162
|
+
- !ruby/object:Gem::Dependency
|
|
163
|
+
name: appraisal2
|
|
164
|
+
requirement: !ruby/object:Gem::Requirement
|
|
165
|
+
requirements:
|
|
166
|
+
- - "~>"
|
|
167
|
+
- !ruby/object:Gem::Version
|
|
168
|
+
version: '3.0'
|
|
169
|
+
type: :development
|
|
170
|
+
prerelease: false
|
|
171
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
172
|
+
requirements:
|
|
173
|
+
- - "~>"
|
|
174
|
+
- !ruby/object:Gem::Version
|
|
175
|
+
version: '3.0'
|
|
176
|
+
- !ruby/object:Gem::Dependency
|
|
177
|
+
name: kettle-soup-cover
|
|
178
|
+
requirement: !ruby/object:Gem::Requirement
|
|
179
|
+
requirements:
|
|
180
|
+
- - "~>"
|
|
181
|
+
- !ruby/object:Gem::Version
|
|
182
|
+
version: '1.1'
|
|
183
|
+
- - ">="
|
|
184
|
+
- !ruby/object:Gem::Version
|
|
185
|
+
version: 1.1.1
|
|
186
|
+
type: :development
|
|
187
|
+
prerelease: false
|
|
188
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
189
|
+
requirements:
|
|
190
|
+
- - "~>"
|
|
191
|
+
- !ruby/object:Gem::Version
|
|
192
|
+
version: '1.1'
|
|
193
|
+
- - ">="
|
|
194
|
+
- !ruby/object:Gem::Version
|
|
195
|
+
version: 1.1.1
|
|
196
|
+
- !ruby/object:Gem::Dependency
|
|
197
|
+
name: kettle-test
|
|
198
|
+
requirement: !ruby/object:Gem::Requirement
|
|
199
|
+
requirements:
|
|
200
|
+
- - "~>"
|
|
201
|
+
- !ruby/object:Gem::Version
|
|
202
|
+
version: '1.0'
|
|
203
|
+
- - ">="
|
|
204
|
+
- !ruby/object:Gem::Version
|
|
205
|
+
version: 1.0.7
|
|
206
|
+
type: :development
|
|
207
|
+
prerelease: false
|
|
208
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
209
|
+
requirements:
|
|
210
|
+
- - "~>"
|
|
211
|
+
- !ruby/object:Gem::Version
|
|
212
|
+
version: '1.0'
|
|
213
|
+
- - ">="
|
|
214
|
+
- !ruby/object:Gem::Version
|
|
215
|
+
version: 1.0.7
|
|
216
|
+
- !ruby/object:Gem::Dependency
|
|
217
|
+
name: ruby-progressbar
|
|
218
|
+
requirement: !ruby/object:Gem::Requirement
|
|
219
|
+
requirements:
|
|
220
|
+
- - "~>"
|
|
221
|
+
- !ruby/object:Gem::Version
|
|
222
|
+
version: '1.13'
|
|
223
|
+
type: :development
|
|
224
|
+
prerelease: false
|
|
225
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
226
|
+
requirements:
|
|
227
|
+
- - "~>"
|
|
228
|
+
- !ruby/object:Gem::Version
|
|
229
|
+
version: '1.13'
|
|
230
|
+
- !ruby/object:Gem::Dependency
|
|
231
|
+
name: stone_checksums
|
|
232
|
+
requirement: !ruby/object:Gem::Requirement
|
|
233
|
+
requirements:
|
|
234
|
+
- - "~>"
|
|
235
|
+
- !ruby/object:Gem::Version
|
|
236
|
+
version: '1.0'
|
|
237
|
+
- - ">="
|
|
238
|
+
- !ruby/object:Gem::Version
|
|
239
|
+
version: 1.0.2
|
|
240
|
+
type: :development
|
|
241
|
+
prerelease: false
|
|
242
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
243
|
+
requirements:
|
|
244
|
+
- - "~>"
|
|
245
|
+
- !ruby/object:Gem::Version
|
|
246
|
+
version: '1.0'
|
|
247
|
+
- - ">="
|
|
248
|
+
- !ruby/object:Gem::Version
|
|
249
|
+
version: 1.0.2
|
|
250
|
+
- !ruby/object:Gem::Dependency
|
|
251
|
+
name: gitmoji-regex
|
|
252
|
+
requirement: !ruby/object:Gem::Requirement
|
|
253
|
+
requirements:
|
|
254
|
+
- - "~>"
|
|
255
|
+
- !ruby/object:Gem::Version
|
|
256
|
+
version: '1.0'
|
|
257
|
+
- - ">="
|
|
258
|
+
- !ruby/object:Gem::Version
|
|
259
|
+
version: 1.0.3
|
|
260
|
+
type: :development
|
|
261
|
+
prerelease: false
|
|
262
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
263
|
+
requirements:
|
|
264
|
+
- - "~>"
|
|
265
|
+
- !ruby/object:Gem::Version
|
|
266
|
+
version: '1.0'
|
|
267
|
+
- - ">="
|
|
268
|
+
- !ruby/object:Gem::Version
|
|
269
|
+
version: 1.0.3
|
|
270
|
+
description: "☯️ Bash::Merge provides smart Bash script merging that preserves comments,
|
|
271
|
+
understands shell structure, and supports freeze blocks for protecting destination
|
|
272
|
+
content. Perfect for merging configuration scripts and shell templates with customized
|
|
273
|
+
destination files."
|
|
274
|
+
email:
|
|
275
|
+
- floss@galtzo.com
|
|
276
|
+
executables: []
|
|
277
|
+
extensions: []
|
|
278
|
+
extra_rdoc_files:
|
|
279
|
+
- CHANGELOG.md
|
|
280
|
+
- CITATION.cff
|
|
281
|
+
- CODE_OF_CONDUCT.md
|
|
282
|
+
- CONTRIBUTING.md
|
|
283
|
+
- FUNDING.md
|
|
284
|
+
- LICENSE.txt
|
|
285
|
+
- README.md
|
|
286
|
+
- REEK
|
|
287
|
+
- RUBOCOP.md
|
|
288
|
+
- SECURITY.md
|
|
289
|
+
files:
|
|
290
|
+
- CHANGELOG.md
|
|
291
|
+
- CITATION.cff
|
|
292
|
+
- CODE_OF_CONDUCT.md
|
|
293
|
+
- CONTRIBUTING.md
|
|
294
|
+
- FUNDING.md
|
|
295
|
+
- LICENSE.txt
|
|
296
|
+
- README.md
|
|
297
|
+
- REEK
|
|
298
|
+
- RUBOCOP.md
|
|
299
|
+
- SECURITY.md
|
|
300
|
+
- lib/bash-merge.rb
|
|
301
|
+
- lib/bash/merge.rb
|
|
302
|
+
- lib/bash/merge/comment_tracker.rb
|
|
303
|
+
- lib/bash/merge/conflict_resolver.rb
|
|
304
|
+
- lib/bash/merge/debug_logger.rb
|
|
305
|
+
- lib/bash/merge/emitter.rb
|
|
306
|
+
- lib/bash/merge/file_analysis.rb
|
|
307
|
+
- lib/bash/merge/freeze_node.rb
|
|
308
|
+
- lib/bash/merge/merge_result.rb
|
|
309
|
+
- lib/bash/merge/node_wrapper.rb
|
|
310
|
+
- lib/bash/merge/smart_merger.rb
|
|
311
|
+
- lib/bash/merge/version.rb
|
|
312
|
+
- sig/bash/merge.rbs
|
|
313
|
+
homepage: https://github.com/kettle-rb/bash-merge
|
|
314
|
+
licenses:
|
|
315
|
+
- MIT
|
|
316
|
+
metadata:
|
|
317
|
+
homepage_uri: https://bash-merge.galtzo.com/
|
|
318
|
+
source_code_uri: https://github.com/kettle-rb/bash-merge/tree/v1.0.0
|
|
319
|
+
changelog_uri: https://github.com/kettle-rb/bash-merge/blob/v1.0.0/CHANGELOG.md
|
|
320
|
+
bug_tracker_uri: https://github.com/kettle-rb/bash-merge/issues
|
|
321
|
+
documentation_uri: https://www.rubydoc.info/gems/bash-merge/1.0.0
|
|
322
|
+
funding_uri: https://github.com/sponsors/pboling
|
|
323
|
+
wiki_uri: https://github.com/kettle-rb/bash-merge/wiki
|
|
324
|
+
news_uri: https://www.railsbling.com/tags/bash-merge
|
|
325
|
+
discord_uri: https://discord.gg/3qme4XHNKN
|
|
326
|
+
rubygems_mfa_required: 'true'
|
|
327
|
+
rdoc_options:
|
|
328
|
+
- "--title"
|
|
329
|
+
- bash-merge - ☯️ Intelligent Bash script merging using tree-sitter AST analysis
|
|
330
|
+
- "--main"
|
|
331
|
+
- README.md
|
|
332
|
+
- "--exclude"
|
|
333
|
+
- "^sig/"
|
|
334
|
+
- "--line-numbers"
|
|
335
|
+
- "--inline-source"
|
|
336
|
+
- "--quiet"
|
|
337
|
+
require_paths:
|
|
338
|
+
- lib
|
|
339
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
340
|
+
requirements:
|
|
341
|
+
- - ">="
|
|
342
|
+
- !ruby/object:Gem::Version
|
|
343
|
+
version: 3.2.0
|
|
344
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
345
|
+
requirements:
|
|
346
|
+
- - ">="
|
|
347
|
+
- !ruby/object:Gem::Version
|
|
348
|
+
version: '0'
|
|
349
|
+
requirements: []
|
|
350
|
+
rubygems_version: 4.0.3
|
|
351
|
+
specification_version: 4
|
|
352
|
+
summary: "☯️ Intelligent Bash script merging using tree-sitter AST analysis"
|
|
353
|
+
test_files: []
|
metadata.gz.sig
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
&XC�=�U-qtU����*X]��5w<��Є�Lp�0_����XD���@k>���(iD/��o���:z���4**LD������;}i��G�ޯ���Sj�)�����|���"�eDE�O,͘ �\��G��X�����H�?p$���m�O�t�������ʒ1�;���~BVz+�7����\Vo��g��*��t�w�0�*�j`mf̾�-_q��?���C��6�}�ʔ_��d4�F
|
|
2
|
+
��ݔxM�{��
|
|
3
|
+
�+��IZѸ��8E�}��خ�9�E��f�mMZ�z�[1w��0�a6vu��&��KI!@W�ʦ
|