Module: Ast::Merge::Git

Defined in:
lib/ast/merge/git.rb,
lib/ast/merge/git/corpus.rb,
lib/ast/merge/git/version.rb,
lib/ast/merge/git/local_benchmark.rb,
sig/ast/merge/git.rbs

Overview

Adapts Git merge-driver roles and outcomes to the portable provider API. rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/ModuleLength -- Git protocol translation is one cohesive adapter boundary

Defined Under Namespace

Modules: Version Classes: Corpus, CorpusAcquirer, CorpusRunner, LocalBenchmark, LocalBenchmarkReport, LocalBenchmarkRunner

Constant Summary collapse

PACKAGE_NAME =

Returns:

  • (String)
'ast-merge-git'
EXIT_SUCCESS =

Returns:

  • (Integer)
0
EXIT_CONFLICT =

Returns:

  • (Integer)
1
EXIT_ERROR =

Returns:

  • (Integer)
2
CONFLICT_POLICIES =

Returns:

  • (Array[Symbol])
%i[write leave_ours].freeze
ADAPTER_ERROR_CATEGORIES =

Returns:

  • (Array[Symbol])
%i[
  file_error
  invalid_provider_output
  invalid_provider_result
].freeze
VERSION =

Current gem version exposed at the traditional constant location.

Returns:

  • (String)
Version::VERSION

Class Method Summary collapse

Class Method Details

.git_exit_code(result) ⇒ Integer

Parameters:

  • result (Hash[Symbol, untyped])

Returns:

  • (Integer)


60
61
62
63
64
65
66
# File 'lib/ast/merge/git.rb', line 60

def git_exit_code(result)
  return EXIT_SUCCESS if result[:ok]
  return EXIT_ERROR if adapter_error?(result)
  return EXIT_CONFLICT unless result.fetch(:conflicts, []).empty?

  EXIT_ERROR
end

.merge3(request) ⇒ Hash[Symbol, untyped]

Parameters:

  • request (Hash[Symbol | String, untyped])

Returns:

  • (Hash[Symbol, untyped])


25
26
27
28
29
30
31
# File 'lib/ast/merge/git.rb', line 25

def merge3(request)
  normalized = normalize_request(request)
  provider_result = Ast::Merge.dispatch_provider(:merge3, provider_request(normalized))
  adapt_provider_result(provider_result)
rescue Ast::Merge::ProviderContract::Error, ArgumentError, KeyError => e
  adapt_provider_result(adapter_failure(:invalid_provider_result, e.message))
end

.merge_files(base_path:, ours_path:, theirs_path:, conflict_policy: :write, **request) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/ast/merge/git.rb', line 33

def merge_files(base_path:, ours_path:, theirs_path:, conflict_policy: :write, **request)
  policy = normalize_conflict_policy(conflict_policy)
  result = merge3(
    request.merge(
      base_source: File.binread(base_path),
      ours_source: File.binread(ours_path),
      theirs_source: File.binread(theirs_path),
      path_name: request[:path_name] || ours_path
    )
  )
  write_result(result, ours_path, policy)
rescue SystemCallError => e
  file_failure = adapt_provider_result(adapter_failure(:file_error, e.message))
  file_failure.merge(git: git_report(file_failure, ours_path, policy, output_written: false))
end

.run(argv, env: ENV, stderr: $stderr) ⇒ Integer

Parameters:

  • argv (Array[String])
  • env: (Hash[String, String]) (defaults to: ENV)
  • stderr: (IO) (defaults to: $stderr)

Returns:

  • (Integer)


49
50
51
52
53
54
55
56
57
58
# File 'lib/ast/merge/git.rb', line 49

def run(argv, env: ENV, stderr: $stderr)
  load_provider_requirements(env['AST_MERGE_REQUIRE'])
  request = command_request(argv, env)
  result = merge_files(**request)
  emit_diagnostics(result, stderr)
  result.dig(:git, :exit_code)
rescue ArgumentError, LoadError => e
  stderr.puts("#{PACKAGE_NAME}: #{e.message}")
  EXIT_ERROR
end