From f42544cb6b1a55d0d4abe17710b673aa44008f1d Mon Sep 17 00:00:00 2001
From: Seungha Yang <seungha.yang@navercorp.com>
Date: Fri, 25 Jan 2019 02:13:08 +0900
Subject: [PATCH] uninstalled: Add support PowerShell on Windows

... 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      | 19 +++++++++++++++++++
 gst-uninstalled.py | 16 ++++++++++++++--
 2 files changed, 33 insertions(+), 2 deletions(-)
 create mode 100644 cmd_or_ps.ps1

diff --git a/cmd_or_ps.ps1 b/cmd_or_ps.ps1
new file mode 100644
index 0000000000..b134006517
--- /dev/null
+++ b/cmd_or_ps.ps1
@@ -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++
+}
diff --git a/gst-uninstalled.py b/gst-uninstalled.py
index 1e5adabcde..211c60ad53 100755
--- a/gst-uninstalled.py
+++ b/gst-uninstalled.py
@@ -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")):