Merge pull request #72 from lektor/feature/install-windows

Same dialog as in unix install script and small fixes
This commit is contained in:
Armin Ronacher 2016-03-17 17:27:44 +01:00
commit 3bcd146b44
1 changed files with 85 additions and 84 deletions

View File

@ -5,12 +5,13 @@ import json
import urllib import urllib
import tempfile import tempfile
import tarfile import tarfile
import shutil
from subprocess import Popen from subprocess import Popen
from _winreg import OpenKey, CloseKey, QueryValueEx, SetValueEx, \ from _winreg import OpenKey, CloseKey, QueryValueEx, SetValueEx, \
HKEY_CURRENT_USER, KEY_ALL_ACCESS, REG_EXPAND_SZ HKEY_CURRENT_USER, KEY_ALL_ACCESS, REG_EXPAND_SZ
import ctypes import ctypes
from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM, LPVOID from ctypes.wintypes import HWND, UINT, WPARAM, LPARAM, LPVOID
import shutil
VENV_URL = 'https://pypi.python.org/pypi/virtualenv/json' VENV_URL = 'https://pypi.python.org/pypi/virtualenv/json'
APPDATA = os.environ['LocalAppData'] APPDATA = os.environ['LocalAppData']
@ -23,118 +24,118 @@ HWND_BROADCAST = 0xFFFF
WM_SETTINGCHANGE = 0x1A WM_SETTINGCHANGE = 0x1A
def get_location(): def get_confirmation():
install_dir = os.path.join(APPDATA, APP) while 1:
return install_dir input = raw_input('Continue? [Yn] ').lower().strip()
if input in ('', 'y'):
break
elif input == 'n':
print
print 'Aborted!'
sys.exit()
def find_location(): def find_location():
install_dir = get_location() install_dir = os.path.join(APPDATA, APP)
if os.path.exists(install_dir) and os.path.isdir(install_dir): return install_dir, os.path.join(install_dir, LIB)
return None, None
return install_dir, os.path.join(install_dir, LIB)
def deletion_error(func, path, excinfo): def deletion_error(func, path, excinfo):
print 'Problem deleting {}'.format(path) print 'Problem deleting {}'.format(path)
print 'Please try and delete {} manually'.format(path) print 'Please try and delete {} manually'.format(path)
print 'Aborted!' print 'Aborted!'
sys.exit() sys.exit()
def wipe_installation(install_dir):
shutil.rmtree(install_dir, onerror=deletion_error)
def check_installation(install_dir):
if os.path.exists(install_dir):
print ' Lektor seems to be installed already.'
print ' Continuing will delete:'
print ' %s' % install_dir
print
get_confirmation()
print
wipe_installation(install_dir)
def fail(message): def fail(message):
print 'Error: %s' % message print 'Error: %s' % message
sys.exit(1) sys.exit(1)
def add_to_path(location): def add_to_path(location):
reg_key = OpenKey(ROOT_KEY, SUB_KEY, 0, KEY_ALL_ACCESS) reg_key = OpenKey(ROOT_KEY, SUB_KEY, 0, KEY_ALL_ACCESS)
try: try:
path_value, _ = QueryValueEx(reg_key, 'Path') path_value, _ = QueryValueEx(reg_key, 'Path')
except WindowsError: except WindowsError:
path_value = '' path_value = ''
paths = path_value.split(';') paths = path_value.split(';')
if location not in paths: if location not in paths:
paths.append(location) paths.append(location)
path_value = ';'.join(paths) path_value = ';'.join(paths)
SetValueEx(reg_key, 'Path', 0, REG_EXPAND_SZ, path_value) SetValueEx(reg_key, 'Path', 0, REG_EXPAND_SZ, path_value)
SendMessage = ctypes.windll.user32.SendMessageW SendMessage = ctypes.windll.user32.SendMessageW
SendMessage.argtypes = HWND, UINT, WPARAM, LPVOID SendMessage.argtypes = HWND, UINT, WPARAM, LPVOID
SendMessage.restype = LRESULT SendMessage.restype = LRESULT
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, u'Environment') SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, u'Environment')
def install(virtualenv_url, virtualenv_filename, install_dir, lib_dir): def install(virtualenv_url, virtualenv_filename, install_dir, lib_dir):
t = tempfile.mkdtemp() t = tempfile.mkdtemp()
with open(os.path.join(t, 'virtualenv.tar.gz'), 'wb') as f: with open(os.path.join(t, 'virtualenv.tar.gz'), 'wb') as f:
download = urllib.urlopen(virtualenv_url) download = urllib.urlopen(virtualenv_url)
f.write(download.read()) f.write(download.read())
download.close() download.close()
with tarfile.open(os.path.join(t, 'virtualenv.tar.gz'), 'r:gz') as tar: with tarfile.open(os.path.join(t, 'virtualenv.tar.gz'), 'r:gz') as tar:
tar.extractall(path=t) tar.extractall(path=t)
os.makedirs(install_dir) os.makedirs(install_dir)
os.makedirs(lib_dir) os.makedirs(lib_dir)
Popen(['python', 'virtualenv.py', lib_dir], Popen([sys.executable, 'virtualenv.py', lib_dir],
cwd=os.path.join(t, virtualenv_filename)).wait() cwd=os.path.join(t, virtualenv_filename)).wait()
scripts = os.path.join(lib_dir, 'Scripts')
#just using pip.exe and cwd will still install globally scripts = os.path.join(lib_dir, 'Scripts')
Popen([os.path.join(scripts, 'pip.exe'), Popen([os.path.join(scripts, 'pip.exe'),
'install', '--upgrade', 'Lektor'], 'install', '--upgrade', 'Lektor'],
cwd=scripts).wait() cwd=scripts).wait()
with open(os.path.join(install_dir, 'lektor.cmd'), 'w') as link_file: with open(os.path.join(install_dir, 'lektor.cmd'), 'w') as link_file:
link_file.write('@echo off\n') link_file.write('@echo off\n')
link_file.write('\"' + os.path.join(scripts, 'lektor.exe') + '\"' + ' %*') link_file.write('\"' + os.path.join(scripts, 'lektor.exe') + '\"' + ' %*')
add_to_path(install_dir) add_to_path(install_dir)
def main(): def main():
print 'Welcome to Lektor' print
print print 'Welcome to Lektor'
print 'This script will install Lektor on your computer.' print
print print 'This script will install Lektor on your computer.'
print
install_dir, lib_dir = find_location() install_dir, lib_dir = find_location()
if install_dir == None:
print ' Lektor seems to be already installed at:'
print ' {}'.format(get_location())
while 1:
input = raw_input(
'Delete existing and reinstall? [Yn]'
).lower().strip()
if input in ('', 'y'): check_installation(install_dir)
shutil.rmtree(get_location(), onerror=deletion_error)
break
elif input == 'n':
print 'Aborted!'
sys.exit()
install_dir, lib_dir = find_location() print ' Installing at:'
print ' %s' % install_dir
print
get_confirmation()
print ' Installing at: %s' % install_dir for url in json.load(urllib.urlopen(VENV_URL))['urls']:
while 1: if url['python_version'] == 'source':
input = raw_input('Continue? [Yn] ').lower().strip() virtualenv_url = url['url']
if input in ('', 'y'): #stripping '.tar.gz'
break virtualenv_filename = url['filename'][:-7]
elif input == 'n': break
print 'Aborted!' else:
sys.exit() fail('Could not find virtualenv')
for url in json.load(urllib.urlopen(VENV_URL))['urls']: install(virtualenv_url, virtualenv_filename, install_dir, lib_dir)
if url['python_version'] == 'source':
virtualenv_url = url['url']
#stripping '.tar.gz'
virtualenv_filename = url['filename'][:-7]
break
else:
fail('Could not find virtualenv')
install(virtualenv_url, virtualenv_filename, install_dir, lib_dir) print
print 'All done!'
print
print 'All done!'
main() main()
"@ "@