File: wine_runner.rb

package info (click to toggle)
mruby 3.4.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,584 kB
  • sloc: ansic: 51,933; ruby: 29,510; yacc: 7,077; cpp: 517; makefile: 51; sh: 42
file content (71 lines) | stat: -rwxr-xr-x 1,610 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env ruby

# Wrapper for running tests for cross-compiled Windows builds in Wine.

require 'open3'

DOSROOT = 'z:'

# Rewrite test output to replace DOS-isms with Unix-isms.
def clean(output, stderr = false)
  ends_with_newline = !!(output =~ /\n$/)
  executable = ARGV[0].gsub(/\.exe\z/i, '')

  # Fix line-ends
  output = output.gsub(/\r\n/, "\n")

  # Strip out Wine messages


  results = output.split(/\n/).map do |line|
    # Fix file paths
    if line =~ /#{DOSROOT}\\/i
      line.gsub!(/#{DOSROOT}([^:]*)/i) { |path|
        path.gsub!(/^#{DOSROOT}/i, '')
        path.gsub!(%r{\\}, '/')
        path
      }
    end

    # strip '.exe' off the end of the executable's name if needed
    line.gsub!(/(#{Regexp.escape executable})\.exe/i, '\1')

    line
  end

  result_text = results.join("\n")
  result_text += "\n" if ends_with_newline
  result_text
end


def main
  if ARGV.empty? || ARGV[0] =~ /^- (-?) (\?|help|h) $/x
    puts "#{$0} <command-line>"
    exit 0
  end

  # For simplicity, just read all of stdin into memory and pass that
  # as an argument when invoking wine. (Skipped if STDIN was not
  # redirected.)
  if !STDIN.tty?
    input = STDIN.read
  else
    input = ""
  end

  # Disable all Wine messages so they don't interfere with the output
  ENV['WINEDEBUG'] = 'err-all,warn-all,fixme-all,trace-all'

  # Run the program in wine and capture the output
  output, errormsg, status = Open3.capture3('wine', *ARGV, :stdin_data => input)

  # Clean and print the results.
  STDOUT.write clean(output)
  STDERR.write clean(errormsg)

  exit(status.exitstatus)
end


main()