setup: SAT_INSTALL environment variable handles "clean" and "purge" options
This commit is contained in:
parent
bb92c9fe74
commit
abdd3dafb2
2 changed files with 79 additions and 12 deletions
2
INSTALL
2
INSTALL
|
|
@ -18,7 +18,7 @@ WxPython and PyGobject are automatically installed on Debian based distributions
|
|||
On a *buntu, same commands with sudo:
|
||||
|
||||
$ sudo apt-get install python-pip python-dev libxml2-dev libxslt-dev
|
||||
$ SAT_INSTALL=autodeb sudo pip install .
|
||||
$ sudo SAT_INSTALL=autodeb pip install .
|
||||
|
||||
|
||||
After installing SàT, you need to install the media:
|
||||
|
|
|
|||
89
setup.py
89
setup.py
|
|
@ -2,7 +2,8 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
# SAT: a jabber client
|
||||
# Copyright (C) 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org)
|
||||
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org)
|
||||
# Copyright (C) 2013, 2014 Adrien Cossa (souliane@mailoo.org)
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published by
|
||||
|
|
@ -26,14 +27,19 @@ import os
|
|||
import sys
|
||||
import subprocess
|
||||
from stat import ST_MODE
|
||||
import shutil
|
||||
|
||||
|
||||
NAME = 'sat'
|
||||
LAUNCH_DAEMON_COMMAND = 'sat'
|
||||
|
||||
ENV_SAT_INSTALL = "SAT_INSTALL" # environment variable to customise installation
|
||||
NO_PREINSTALL_OPT = 'nopreinstall' # skip all preinstallation checks
|
||||
AUTO_DEB_OPT = 'autodeb' # automaticaly install debs
|
||||
NO_X_OPT = 'nox' # don't install X dependant packages
|
||||
ENV_SAT_INSTALL = "SAT_INSTALL" # environment variable to customise installation
|
||||
NO_PREINSTALL_OPT = 'nopreinstall' # skip all preinstallation checks
|
||||
AUTO_DEB_OPT = 'autodeb' # automaticaly install debs
|
||||
NO_X_OPT = 'nox' # don't install X dependant packages
|
||||
CLEAN_OPT = 'clean' # remove previous installation directories
|
||||
PURGE_OPT = 'purge' # remove building and previous installation directories
|
||||
|
||||
|
||||
class MercurialException(Exception):
|
||||
pass
|
||||
|
|
@ -75,23 +81,83 @@ class CustomInstall(install):
|
|||
def custom_create_links(self):
|
||||
"""Create symbolic links to executables"""
|
||||
# the script which launch the daemon
|
||||
links = [(self.sh_script_path, LAUNCH_DAEMON_COMMAND)]
|
||||
for source, dest in links:
|
||||
dest_name, copied = copy_file(source, os.path.join(self.install_scripts, dest), link='sym')
|
||||
for source, dest in self.sh_script_links:
|
||||
if os.path.islink(dest) and os.readlink(dest) != source:
|
||||
os.remove(dest) # copy_file doesn't force the link update
|
||||
dest_name, copied = copy_file(source, dest, link='sym')
|
||||
assert (copied)
|
||||
# we change the perm in the same way as in the original install_scripts
|
||||
mode = ((os.stat(dest_name)[ST_MODE]) | 0555) & 07777
|
||||
os.chmod(dest_name, mode)
|
||||
|
||||
def run(self):
|
||||
self.sh_script_path = os.path.join(self.install_lib, NAME, 'sat.sh')
|
||||
self.sh_script_links = [(self.sh_script_path, os.path.join(self.install_scripts, LAUNCH_DAEMON_COMMAND))]
|
||||
sys.stdout.write('running pre installation stuff\n')
|
||||
sys.stdout.flush()
|
||||
if PURGE_OPT in install_opt:
|
||||
self.purge()
|
||||
elif CLEAN_OPT in install_opt:
|
||||
self.clean()
|
||||
install.run(self)
|
||||
sys.stdout.write('running post installation stuff\n')
|
||||
sys.stdout.flush()
|
||||
self.sh_script_path = os.path.join(self.install_lib, 'sat', 'sat.sh')
|
||||
self.primitivus_path = os.path.join(self.install_lib, 'sat_frontends', 'primitivus')
|
||||
self.custom_auto_options()
|
||||
self.custom_create_links()
|
||||
|
||||
def confirm(self, message):
|
||||
"""Ask the user for a confirmation"""
|
||||
message += 'Proceed'
|
||||
while True:
|
||||
res = raw_input("%s (y/n)? " % message)
|
||||
if res not in ['y', 'Y', 'n', 'N']:
|
||||
print "Your response ('%s') was not one of the expected responses: y, n" % res
|
||||
message = 'Proceed'
|
||||
continue
|
||||
if res in ('y', 'Y'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def clean(self, message=None, to_remove=None):
|
||||
"""Clean previous installation directories
|
||||
|
||||
@param message (str): to use a non-default confirmation message
|
||||
@param to_remove (str): extra files/directories to remove
|
||||
"""
|
||||
if message is None:
|
||||
message = "Cleaning previous installation directories"
|
||||
if to_remove is None:
|
||||
to_remove = []
|
||||
to_remove.extend([os.path.join(self.install_lib, NAME),
|
||||
os.path.join(self.install_data, 'share', 'doc', NAME),
|
||||
os.path.join(self.install_lib, "%s-py%s.egg-info" % (self.config_vars['dist_fullname'], self.config_vars['py_version_short'])),
|
||||
])
|
||||
for source, dest in self.sh_script_links:
|
||||
if os.path.islink(dest):
|
||||
to_remove.append(dest)
|
||||
|
||||
for script in ('jp', 'wix', 'primitivus'):
|
||||
dest = os.path.join(self.install_scripts, script)
|
||||
if os.path.exists(dest):
|
||||
to_remove.append(dest)
|
||||
|
||||
message = "%s:\n%s\n" % (message, "\n".join([" %s" % path for path in to_remove]))
|
||||
if not self.confirm(message):
|
||||
return
|
||||
sys.stdout.write('cleaning previous installation directories...\n')
|
||||
sys.stdout.flush()
|
||||
for path in to_remove:
|
||||
if os.path.isdir(path):
|
||||
shutil.rmtree(path, ignore_errors=True)
|
||||
else:
|
||||
os.remove(path)
|
||||
|
||||
def purge(self):
|
||||
"""Clean building and previous installation directories"""
|
||||
message = "Cleaning building and previous installation directories"
|
||||
to_remove = [os.path.join(os.getcwd(), 'build')]
|
||||
self.clean(message, to_remove)
|
||||
|
||||
|
||||
def preinstall_check(install_opt):
|
||||
"""Check presence of problematic dependencies, and try to install them with package manager
|
||||
|
|
@ -121,7 +187,7 @@ def preinstall_check(install_opt):
|
|||
modules_toinstall.append('mercurial')""" # hg can be installed from pypi
|
||||
|
||||
if modules_toinstall:
|
||||
if AUTO_DEB_OPT in install_opt: # auto debian installation is requested
|
||||
if AUTO_DEB_OPT in install_opt: # auto debian installation is requested
|
||||
# are we on a distribution using apt ?
|
||||
apt_path = subprocess.Popen('which apt-get', stdout=subprocess.PIPE, shell=True).communicate()[0][:-1]
|
||||
else:
|
||||
|
|
@ -146,6 +212,7 @@ def preinstall_check(install_opt):
|
|||
sys.stdout.write("- %s (Debian name: %s)\n" % (module_name, package[module_name]))
|
||||
sys.exit(2)
|
||||
|
||||
|
||||
if sys.argv[1].lower() in ['egg_info', 'install']:
|
||||
# we only check dependencies if egg_info or install is used
|
||||
install_opt = os.environ.get(ENV_SAT_INSTALL, "").split()
|
||||
|
|
|
|||
Loading…
Reference in a new issue