uninstalled: Add support PowerShell on Windows
authorSeungha Yang <seungha.yang@navercorp.com>
Thu, 24 Jan 2019 17:13:08 +0000 (02:13 +0900)
committerNirbheek Chauhan <nirbheek.chauhan@gmail.com>
Tue, 2 Apr 2019 08:35:03 +0000 (08:35 +0000)
... depending on detected shell program. For instance,
if the nearest ancestor process is PowerShell, run uninstalled
environment via PowerShell. Otherwise, $COMSPEC (most likely cmd.exe)
will be used.

cmd_or_ps.ps1 [new file with mode: 0644]
gst-uninstalled.py

diff --git a/cmd_or_ps.ps1 b/cmd_or_ps.ps1
new file mode 100644 (file)
index 0000000..b134006
--- /dev/null
@@ -0,0 +1,19 @@
+$i=1
+$ppid=(gwmi win32_process -Filter "processid='$pid'").parentprocessid
+$pname=(Get-Process -id $ppid).Name
+While($true) {
+  if($pname -eq "cmd" -Or $pname -eq "powershell") {
+    Write-Host ("{0}.exe" -f $pname)
+    Break
+  }
+
+  # 10 times iteration seems to be sufficient
+  if($i -gt 10) {
+    Break
+  }
+
+  # not found yet, find grand parant
+  $ppid=(gwmi win32_process -Filter "processid='$ppid'").parentprocessid
+  $pname=(Get-Process -id $ppid).Name
+  $i++
+}
index 1e5adab..211c60a 100755 (executable)
@@ -193,6 +193,11 @@ def get_subprocess_env(options, gst_version):
 
     return env
 
+def get_windows_shell():
+    command = ['powershell.exe' ,'-noprofile', '-executionpolicy', 'bypass', '-file', 'cmd_or_ps.ps1']
+    result = subprocess.check_output(command)
+    return result.decode().strip()
+
 # https://stackoverflow.com/questions/1871549/determine-if-python-is-running-inside-virtualenv
 def in_venv():
     return (hasattr(sys, 'real_prefix') or
@@ -226,8 +231,15 @@ if __name__ == "__main__":
 
     if not args:
         if os.name is 'nt':
-            args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")]
-            args += ['/k', 'prompt [gst-{}] $P$G'.format(gst_version)]
+            shell = get_windows_shell()
+            if shell == 'powershell.exe':
+                args = ['powershell.exe']
+                args += ['-NoLogo', '-NoExit']
+                prompt = 'function global:prompt {  "[gst-' + gst_version + '"+"] PS " + $PWD + "> "}'
+                args += ['-Command', prompt]
+            else:
+                args = [os.environ.get("COMSPEC", r"C:\WINDOWS\system32\cmd.exe")]
+                args += ['/k', 'prompt [gst-{}] $P$G'.format(gst_version)]
         else:
             args = [os.environ.get("SHELL", os.path.realpath("/bin/sh"))]
         if "bash" in args[0] and not strtobool(os.environ.get("GST_BUILD_DISABLE_PS1_OVERRIDE", r"FALSE")):