Sha256: cb2390f92a0a7843bf543d582d15b4c4f3ad11adc247a12ae0aa80684b2b5ceb

Contents?: true

Size: 1.27 KB

Versions: 1

Compression:

Stored size: 1.27 KB

Contents

# frozen_string_literal: true

require 'open3'
require 'io/wait'

module Mnogootex
  module Job
    class Runner
      POLLING_TIMEOUT = 0.02

      attr_reader :hid, :log_lines

      def initialize(cmd:, chdir:)
        @log_lines = []
        _, @stream, @thread = Open3.popen2e(*cmd, chdir: chdir)
        @poller = start_poller
      end

      def alive?
        @poller.alive?
      end

      def successful?
        @poller.value.exitstatus.zero?
      end

      def count_lines
        return log_lines.size unless alive?

        @ticks = [@ticks || -1, log_lines.size - 1].min + 1
      end

      private

      def start_poller
        Thread.new do
          polling_loop

          # NOTE: waits on @thread and returns its value
          @thread.value
        end
      end

      def polling_loop
        loop do
          if @stream.wait_readable(POLLING_TIMEOUT).nil?
            # If the stream timeouts and the thread is dead we expect no nore data.
            # This happens on commands like `latexmk -pv` which fork other processes.
            break unless @thread.alive?
          else
            # If we reach EOF, we expect no more data.
            break if (line = @stream.gets).nil?

            log_lines << line
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mnogootex-2.0.0 lib/mnogootex/job/runner.rb