ast-merge-git 7.1.9 → 7.1.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0948b2cf9835a3a0726b52a9619be02dabf95e0da008e299644e4916b8da7ed3'
4
- data.tar.gz: 03d94e0ee7627a85899bd7f33afbe5ee60c60c54b59a8a37b321830fc1fb6112
3
+ metadata.gz: 0fd20591b0e3de1b3a8c6765f85cdedc5d3f19fea69e1be9d6490d50af756a54
4
+ data.tar.gz: 92b8bbab49809926e97922d7092992ac1c54f1e82bd15f0af1b9e0a0f52d0aea
5
5
  SHA512:
6
- metadata.gz: 42871ebd37702ea5d2c36968f5e1dd2ec7415d86c2f71fc7efebf961a1589917f5217d89b24f2769357ad51d43a01f59fc74320bf6867a2db2459da6b382445a
7
- data.tar.gz: 31e29b5f3c7f38cb600f33100c57bd9aaed8b6319a98fe93dcc7380cde48644fa44ad15822258edd297707730d7ff478b4adc7bec22853f8f47b2b5fb4a9d821
6
+ metadata.gz: 21e177752270944833a9a50e1fc3845614db43959949b7abdfc46ea3b6b7b840e8c4c1c8d46405d7b7d3299a9f309f8df29060ed133ab093bee5a81f3e324200
7
+ data.tar.gz: 21caa075844f315ce7aa7f51a700328ac5f86cb6e03a3bbaa0a18a3e5c945910b4d7548c7253e49b82f93323eb82adc1902bce034a469380c455d3feba152210
checksums.yaml.gz.sig CHANGED
Binary file
@@ -1049,7 +1049,8 @@ module Ast
1049
1049
  item,
1050
1050
  capture.fetch(:status),
1051
1051
  checks,
1052
- stderr: capture.fetch(:stderr, '')
1052
+ stderr: capture.fetch(:stderr, ''),
1053
+ conflict_regions: markers
1053
1054
  )
1054
1055
  eligible = item.dig('oracle', 'score_eligible') && !%w[unsupported excluded_ambiguous].include?(classified)
1055
1056
  {
@@ -1217,9 +1218,13 @@ module Ast
1217
1218
  'analyzed'
1218
1219
  end
1219
1220
 
1220
- def classify(item, status, checks, stderr: '')
1221
+ def classify(item, status, checks, stderr: '', conflict_regions: [])
1221
1222
  expected = item.dig('expected', 'outcome')
1222
1223
  return 'excluded_ambiguous' if expected == 'excluded_ambiguous'
1224
+ # Exit 1 alone also describes Ruby startup failures and other crashes.
1225
+ # Require an emitted marker region or the portable conflict diagnostic;
1226
+ # the expected oracle must never turn an unexplained failure into success.
1227
+ return 'error' if status == 1 && conflict_regions.empty? && !conflict_diagnostic?(stderr)
1223
1228
 
1224
1229
  if expected == 'error'
1225
1230
  return 'error' if status.nil?
@@ -1240,6 +1245,13 @@ module Ast
1240
1245
  status >= 2 && /\A[^:\r\n]+: (?:destination_)?parse_error:/i.match?(stderr.to_s)
1241
1246
  end
1242
1247
 
1248
+ def conflict_diagnostic?(stderr)
1249
+ # This parses a diagnostic transport header, not source syntax/ownership.
1250
+ # Older kernel adapters omit a separate code but still emit the
1251
+ # explicit category. Do not reject that established wire format.
1252
+ /\A[^:\r\n]+: merge_conflict: [^\s][^\r\n]*/i.match?(stderr.to_s)
1253
+ end
1254
+
1243
1255
  def equivalence_checks(item, output)
1244
1256
  expected = item.dig('expected', 'output', 'bytes')
1245
1257
  exact = !expected.nil? && output == expected
@@ -1413,10 +1425,15 @@ module Ast
1413
1425
  def conflict_regions(output)
1414
1426
  ranges = []
1415
1427
  start_byte = nil
1428
+ separator = false
1416
1429
  offset = 0
1417
1430
  output.each_line do |line|
1418
- start_byte = offset if line.start_with?('<<<<<<<')
1419
- if start_byte && line.start_with?('>>>>>>>')
1431
+ if line.start_with?('<<<<<<<')
1432
+ start_byte = offset
1433
+ separator = false
1434
+ end
1435
+ separator = true if start_byte && line.start_with?('=======')
1436
+ if start_byte && separator && line.start_with?('>>>>>>>')
1420
1437
  ranges << { 'start_byte' => start_byte, 'end_byte' => offset + line.bytesize }
1421
1438
  start_byte = nil
1422
1439
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ast/merge'
4
+ require 'ast/merge/typed_core_provider'
5
+
6
+ module Ast
7
+ module Merge
8
+ module Git
9
+ # Compatibility name only: Rust owns merge decisions and marker rendering.
10
+ class RustHostProvider < Ast::Merge::TypedCoreProvider
11
+ PROVIDER_ID = 'rust.git.json'
12
+ FAMILY = 'json'
13
+ OPERATIONS = [:merge3].freeze
14
+ CORE_PROVIDER = 'kernel.git.json'
15
+ CORE_PROFILE = 'kernel.git.json.v1'
16
+ PACKAGE = 'ast-merge-git'
17
+
18
+ private
19
+
20
+ def package_version = Ast::Merge::Git::Version::VERSION
21
+
22
+ # path_name is context, never a substitute for the explicit dialect.
23
+ def additional_fields = %i[path_name labels conflict_marker_size]
24
+
25
+ def policy(_operation, request)
26
+ labels = request.fetch(:labels, {})
27
+ unless labels.is_a?(Hash) && labels.values.all? do |label|
28
+ label.is_a?(String)
29
+ end
30
+ raise ArgumentError,
31
+ 'Git labels must be a Hash of text values'
32
+ end
33
+
34
+ width = request[:conflict_marker_size]
35
+ width = Integer(width, 10) if width.is_a?(String) # Git argv is textual.
36
+ raise ArgumentError, 'Git marker width must be an Integer' unless width.nil? || width.is_a?(Integer)
37
+
38
+ core::OperationPolicy.from_merge3(core::ThreeWayMergePolicy.new(
39
+ render_policy: 'source-preserving', fallback_policy: 'none',
40
+ labels: labels.transform_keys(&:to_s), conflict_marker_size: width, extra: {}
41
+ ))
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ Ast::Merge::Git.register_rust_host_provider! if Ast::Merge::Git::RustHostProvider.available?
@@ -6,7 +6,7 @@ module Ast
6
6
  # Version namespace for this gem.
7
7
  module Version
8
8
  # Current gem version.
9
- VERSION = '7.1.9'
9
+ VERSION = '7.1.10'
10
10
  end
11
11
  # Current gem version exposed at the traditional constant location.
12
12
  VERSION = Version::VERSION # Traditional Constant Location
data/lib/ast/merge/git.rb CHANGED
@@ -12,6 +12,7 @@ module Ast
12
12
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/ModuleLength -- Git protocol translation is one cohesive adapter boundary
13
13
  module Git
14
14
  PACKAGE_NAME = 'ast-merge-git'
15
+ autoload :RustHostProvider, 'ast/merge/git/rust_host_provider'
15
16
  EXIT_SUCCESS = 0
16
17
  EXIT_CONFLICT = 1
17
18
  EXIT_ERROR = 2
@@ -21,6 +22,13 @@ module Ast
21
22
  invalid_provider_output
22
23
  invalid_provider_result
23
24
  ].freeze
25
+ RUST_PROVIDER_FAMILIES = {
26
+ 'bash' => 'Bash::Merge',
27
+ 'go' => 'Go::Merge',
28
+ 'json' => 'Json::Merge',
29
+ 'rust' => 'Rust::Merge',
30
+ 'typescript' => 'TypeScript::Merge'
31
+ }.freeze
24
32
 
25
33
  module_function
26
34
 
@@ -32,6 +40,14 @@ module Ast
32
40
  adapt_provider_result(adapter_failure(:invalid_provider_result, e.message))
33
41
  end
34
42
 
43
+ def rust_host_provider
44
+ RustHostProvider.new
45
+ end
46
+
47
+ def register_rust_host_provider!(replace: false)
48
+ Ast::Merge.register_provider(rust_host_provider, replace: replace)
49
+ end
50
+
35
51
  def merge_files(base_path:, ours_path:, theirs_path:, conflict_policy: :write, **request)
36
52
  policy = normalize_conflict_policy(conflict_policy)
37
53
  result = merge3(
@@ -51,6 +67,7 @@ module Ast
51
67
  def run(argv, env: ENV, stderr: $stderr)
52
68
  load_provider_requirements(env['AST_MERGE_REQUIRE'])
53
69
  request = command_request(argv, env)
70
+ register_explicit_rust_provider(request)
54
71
  result = merge_files(**request)
55
72
  emit_diagnostics(result, stderr)
56
73
  result.dig(:git, :exit_code)
@@ -255,6 +272,28 @@ module Ast
255
272
  end
256
273
  private_class_method :load_provider_requirements
257
274
 
275
+ def register_explicit_rust_provider(request)
276
+ provider_id = request[:provider_id].to_s
277
+ if provider_id == 'rust.git.json'
278
+ register_rust_host_provider!(replace: true) if RustHostProvider.available?
279
+ return
280
+ end
281
+ return unless provider_id.start_with?('rust.')
282
+
283
+ family_module_name = RUST_PROVIDER_FAMILIES[request[:family].to_s]
284
+ return unless family_module_name
285
+
286
+ family_module = family_module_name.split('::').inject(Object) do |namespace, name|
287
+ break nil unless namespace.const_defined?(name, false)
288
+
289
+ namespace.const_get(name, false)
290
+ end
291
+ return unless family_module.respond_to?(:register_rust_host_provider!)
292
+
293
+ family_module.register_rust_host_provider!(replace: true)
294
+ end
295
+ private_class_method :register_explicit_rust_provider
296
+
258
297
  def emit_diagnostics(result, stderr)
259
298
  result.fetch(:diagnostics).each do |item|
260
299
  stderr.puts("#{PACKAGE_NAME}: #{item[:category]}: #{item[:message]}")
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ast-merge-git
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.1.9
4
+ version: 7.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -43,28 +43,28 @@ dependencies:
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 7.1.9
46
+ version: 7.1.10
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 7.1.9
53
+ version: 7.1.10
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: tree_haver
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 7.1.9
60
+ version: 7.1.10
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 7.1.9
67
+ version: 7.1.10
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: version_gem
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -91,20 +91,20 @@ dependencies:
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: '3.0'
94
+ version: '3.1'
95
95
  - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: 3.0.34
97
+ version: 3.1.8
98
98
  type: :development
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '3.0'
104
+ version: '3.1'
105
105
  - - ">="
106
106
  - !ruby/object:Gem::Version
107
- version: 3.0.34
107
+ version: 3.1.8
108
108
  - !ruby/object:Gem::Dependency
109
109
  name: bundler-audit
110
110
  requirement: !ruby/object:Gem::Requirement
@@ -182,7 +182,7 @@ dependencies:
182
182
  version: '3.2'
183
183
  - - ">="
184
184
  - !ruby/object:Gem::Version
185
- version: 3.2.3
185
+ version: 3.2.5
186
186
  type: :development
187
187
  prerelease: false
188
188
  version_requirements: !ruby/object:Gem::Requirement
@@ -192,7 +192,7 @@ dependencies:
192
192
  version: '3.2'
193
193
  - - ">="
194
194
  - !ruby/object:Gem::Version
195
- version: 3.2.3
195
+ version: 3.2.5
196
196
  - !ruby/object:Gem::Dependency
197
197
  name: kettle-test
198
198
  requirement: !ruby/object:Gem::Requirement
@@ -202,7 +202,7 @@ dependencies:
202
202
  version: '2.0'
203
203
  - - ">="
204
204
  - !ruby/object:Gem::Version
205
- version: 2.0.21
205
+ version: 2.0.23
206
206
  type: :development
207
207
  prerelease: false
208
208
  version_requirements: !ruby/object:Gem::Requirement
@@ -212,7 +212,7 @@ dependencies:
212
212
  version: '2.0'
213
213
  - - ">="
214
214
  - !ruby/object:Gem::Version
215
- version: 2.0.21
215
+ version: 2.0.23
216
216
  - !ruby/object:Gem::Dependency
217
217
  name: turbo_tests2
218
218
  requirement: !ruby/object:Gem::Requirement
@@ -222,7 +222,7 @@ dependencies:
222
222
  version: '3.2'
223
223
  - - ">="
224
224
  - !ruby/object:Gem::Version
225
- version: 3.2.7
225
+ version: 3.2.14
226
226
  type: :development
227
227
  prerelease: false
228
228
  version_requirements: !ruby/object:Gem::Requirement
@@ -232,7 +232,7 @@ dependencies:
232
232
  version: '3.2'
233
233
  - - ">="
234
234
  - !ruby/object:Gem::Version
235
- version: 3.2.7
235
+ version: 3.2.14
236
236
  - !ruby/object:Gem::Dependency
237
237
  name: ruby-progressbar
238
238
  requirement: !ruby/object:Gem::Requirement
@@ -256,7 +256,7 @@ dependencies:
256
256
  version: '1.0'
257
257
  - - ">="
258
258
  - !ruby/object:Gem::Version
259
- version: 1.0.8
259
+ version: 1.0.9
260
260
  type: :development
261
261
  prerelease: false
262
262
  version_requirements: !ruby/object:Gem::Requirement
@@ -266,7 +266,7 @@ dependencies:
266
266
  version: '1.0'
267
267
  - - ">="
268
268
  - !ruby/object:Gem::Version
269
- version: 1.0.8
269
+ version: 1.0.9
270
270
  - !ruby/object:Gem::Dependency
271
271
  name: gitmoji-regex
272
272
  requirement: !ruby/object:Gem::Requirement
@@ -276,7 +276,7 @@ dependencies:
276
276
  version: '2.0'
277
277
  - - ">="
278
278
  - !ruby/object:Gem::Version
279
- version: 2.0.12
279
+ version: 2.0.15
280
280
  type: :development
281
281
  prerelease: false
282
282
  version_requirements: !ruby/object:Gem::Requirement
@@ -286,7 +286,7 @@ dependencies:
286
286
  version: '2.0'
287
287
  - - ">="
288
288
  - !ruby/object:Gem::Version
289
- version: 2.0.12
289
+ version: 2.0.15
290
290
  description: "☯️ Git protocol adaptation and provider dispatch over ast-merge primitives."
291
291
  email:
292
292
  - floss@galtzo.com
@@ -303,6 +303,7 @@ files:
303
303
  - lib/ast/merge/git/benchmark_adapter.rb
304
304
  - lib/ast/merge/git/corpus.rb
305
305
  - lib/ast/merge/git/local_benchmark.rb
306
+ - lib/ast/merge/git/rust_host_provider.rb
306
307
  - lib/ast/merge/git/version.rb
307
308
  - sig/ast/merge/git.rbs
308
309
  homepage: https://github.com/structuredmerge/structuredmerge-ruby
@@ -311,10 +312,10 @@ licenses:
311
312
  - PolyForm-Small-Business-1.0.0
312
313
  metadata:
313
314
  homepage_uri: https://structuredmerge.org
314
- source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.9
315
- changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.9/CHANGELOG.md
315
+ source_code_uri: https://github.com/structuredmerge/structuredmerge-ruby/tree/v7.1.10
316
+ changelog_uri: https://github.com/structuredmerge/structuredmerge-ruby/blob/v7.1.10/CHANGELOG.md
316
317
  bug_tracker_uri: https://github.com/structuredmerge/structuredmerge-ruby/issues
317
- documentation_uri: https://www.rubydoc.info/gems/ast-merge-git/7.1.9
318
+ documentation_uri: https://www.rubydoc.info/gems/ast-merge-git/7.1.10
318
319
  funding_uri: https://github.com/sponsors/pboling
319
320
  wiki_uri: https://github.com/structuredmerge/structuredmerge-ruby/wiki
320
321
  news_uri: https://www.railsbling.com/tags/ast-merge-git
@@ -344,7 +345,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
344
345
  - !ruby/object:Gem::Version
345
346
  version: '0'
346
347
  requirements: []
347
- rubygems_version: 4.0.17
348
+ rubygems_version: 4.0.20
348
349
  specification_version: 4
349
350
  summary: "☯️ Format-neutral Git merge-driver adapter for StructuredMerge"
350
351
  test_files: []
metadata.gz.sig CHANGED
Binary file