Class: SourceWindowsBatch

Inherits:
Object
  • Object
show all
Defined in:
lib/source_win_bat.rb

Constant Summary collapse

VERSION =
"0.4.0"

Instance Method Summary collapse

Instance Method Details

#main(argv) ⇒ Object



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
# File 'lib/source_win_bat.rb', line 18

def main(argv)
  @args = parse_args!(argv)
  @args.merge!(parse_option_envs())

  unless [:cygwin, :msys, :wsl].include? UnixCompatEnv.compat_env
    raise "You're in an unsupported UNIX compatible environment"
  end

  load_codepage()
  win_cmd, outfiles, proc_env = make_envsync_cmd(@args[:win_cmd])

  Signal.trap(:INT, "SIG_IGN")
  
  if UnixCompatEnv.compat_env == :wsl
    # * Skip winpty, assuming the system's WSL supports ConPTY
    # * Use an absolute path since SWB overwrites PATH with Windows-style PATH in WSL
    pid = Process.spawn(proc_env,
                        UnixCompatEnv.to_compat_path('C:\\Windows\\System32\\cmd.exe'),
                        '/C', win_cmd, :in => 0, :out => 1, :err => 2)
  elsif !STDOUT.isatty
    pid = Process.spawn(proc_env, 'cmd.exe', '/C', win_cmd, :in => 0, :out => 1, :err => 2)
  else
    pid = Process.spawn(prov_env, 'winpty', '--', 'cmd.exe', '/C', win_cmd, :in => 0, :out => 1, :err => 2)
  end

  Signal.trap(:INT) do
    Process.signal("-KILL", pid)
  end

  status = nil
  loop do
    _, status = Process.wait2(pid)
    break if status.exited?
  end
  
  conv_setenv_stmts(outfiles[:env_windump_file], @args[:env_sync_file])
  conv_doskey_stmts(outfiles[:macro_windump_file], @args[:macro_sync_file])
  gen_chdir_cmds(outfiles[:cwd_windump_file], @args[:cwd_sync_file])

  delete_tmpfiles(outfiles)

  exit(status.exitstatus)
end