##// END OF EJS Templates
wix: more robust normalization of RC version components...
wix: more robust normalization of RC version components MSI has strict version requirements where the format is `A.B.C[.D]` and all fields must be numeric (https://docs.microsoft.com/en-us/windows/win32/msi/productversion?redirectedfrom=MSDN). Only the first 3 are used by the installer itself. Mercurial's version strings can have `rcN` and an optional `+<commit>-<date>` fragment at the end. This commit teaches the MSI version normalization to handle both of these more robustly. Before, we would throw away the `.rcN` component completely. e.g. `5.3rc1` would get normalized to `5.3.0`. And worse, `5.3rc0+5-abcdef` would get normalized to `5.3.5`. After this commit, presence of an `.rcN` provides the value for a 4th field. e.g. `5.3rc1` -> `5.3.0.1`. In addition, the commit count from the `+` suffix gets normalized into the 4th version component, but only if the original version string didn't have a 4th version component or if no `rcN` is present. e.g. `5.3+5-abcdef` is `5.3.0.5`. Differential Revision: https://phab.mercurial-scm.org/D8003

File last commit:

r43487:6a350194 default
r44632:8d653abe stable
Show More
winrm.py
87 lines | 2.0 KiB | text/x-python | PythonLexer
# winrm.py - Interact with Windows Remote Management (WinRM)
#
# Copyright 2019 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
# no-check-code because Python 3 native.
import logging
import pprint
import time
from pypsrp.client import Client
from pypsrp.powershell import (
PowerShell,
PSInvocationState,
RunspacePool,
)
import requests.exceptions
logger = logging.getLogger(__name__)
def wait_for_winrm(host, username, password, timeout=180, ssl=False):
"""Wait for the Windows Remoting (WinRM) service to become available.
Returns a ``psrpclient.Client`` instance.
"""
end_time = time.time() + timeout
while True:
try:
client = Client(
host,
username=username,
password=password,
ssl=ssl,
connection_timeout=5,
)
client.execute_ps("Write-Host 'Hello, World!'")
return client
except requests.exceptions.ConnectionError:
if time.time() >= end_time:
raise
time.sleep(1)
def format_object(o):
if isinstance(o, str):
return o
try:
o = str(o)
except (AttributeError, TypeError):
o = pprint.pformat(o.extended_properties)
return o
def run_powershell(client, script):
with RunspacePool(client.wsman) as pool:
ps = PowerShell(pool)
ps.add_script(script)
ps.begin_invoke()
while ps.state == PSInvocationState.RUNNING:
ps.poll_invoke()
for o in ps.output:
print(format_object(o))
ps.output[:] = []
ps.end_invoke()
for o in ps.output:
print(format_object(o))
if ps.state == PSInvocationState.FAILED:
raise Exception(
'PowerShell execution failed: %s'
% ' '.join(map(format_object, ps.streams.error))
)