Sha256: 42caa7a4ef49bfbaae2e005b75db82f440c5af58913262617639bbd847f71526

Contents?: true

Size: 1.51 KB

Versions: 1

Compression:

Stored size: 1.51 KB

Contents

require 'open3'
require "lorentz/contract/enumerable"

include Lorentz::Contract::Enumerable

module Lorentz
  module Contract
    module Kernel
      class SystemError < StandardError
        attr_accessor :message_list

        def initialize(msg)
          super
        end
      end

      def system_lines(cmd)
        num_retries = 0
        result_lines = []
        begin
          result_lines = []
          puts cmd
          Open3.popen2e(cmd) do |stdin, stdout, thread|
            while line=stdout.gets do
              puts(line)
              result_lines << line
            end
            exit_status = thread.value
            unless exit_status.success?
              result_lines = result_lines.reject! do |line|
                line.match /^\s+\d{3}:\s/
              end.to_a
              err = SystemError.new(result_lines.inspect)
              err.message_list = result_lines
              raise err
            end
          end
          return result_lines.to_enum
        rescue SystemError => e
          if e.message_list.any?{|line|line.match(/Counter \d+ already used for contract/)}
            num_retries += 1
            puts
            puts "Retry number: #{num_retries}"
            retry
          end
          raise e
        end
      end

      def system_line(cmd)
        if result = system_lines(cmd)
          result.first&.chomp
        else
          result
        end
      end

      def system_operation_hash(cmd)
        system_lines(cmd).find_operation_hash
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lorentz-contract-originate-0.1.0 lib/lorentz/contract/kernel.rb