tis-tortoisesvn 1.9.27038-21

  • package : tis-tortoisesvn
  • version : 1.9.27038-21
  • description : Outil de versioning SVN Subversion intégré à l'explorateur Windows (remarque: version 1.8.12 pour win 32 bits et win XP)
  • maintainer : TIS <technique@tranquil-it-systems.fr>
  • date : 2016-02-15 15:37:18
  • signer :
  • signature_date :
  • min_os_version :
  • min_wapt_version :
  • Depends :


from setuphelpers import *
import platform
import glob

uninstallkey = []

# additional options for msi install cusomization
msi_properties = {'ADDLOCAL':'CLI'}

def need_install(key,min_version=None,force=False):
    """Return True if the software with key can be found in uninstall registry
        and the registred version is equal or greater than min_version

        key (str) : uninstall key
        min_version (str) : minimum version or None if don't check verion

    if force or not key:
        return True
        current = installed_softwares(uninstallkey=key)
        for soft in current:
            if not min_version or Version(soft['version']) >= Version(min_version):
                return False
        return True

def install_msi_if_needed(msi,min_version=None,killbefore=[],accept_returncodes=[0,1603,3010],timeout=300,properties={}):
    """Install silently the supplied msi file, and add the uninstall key to
    global uninstall key list

    uninstall key, min_version and silent flags are guessed from msi file.

    Raises an error if, after the msi install, the uninstall key is not found in registry.

    The matching is done on key

        msi (str) : path to the MSI file
        min_version (str) : if installed version is equal or gretaer than this, don't install
                            if not provided, guess it from exe setup file properties.
        kill_before (list of str) : processes to kill before setup, to avoid file locks
        accept_returncodes (list of int) : return codes which are acceptable and don't raise exception
        timeout int) : maximum run time of command in seconds bfore the child is killed and error is raised.
        properties (dict) : map (key=value) of properties for specific msi installation.


    if not isfile(msi):
        error('msi file %s not found in package' % msi)
    key = get_msi_properties(msi)['ProductCode']
    # will try to add key in the caller's (setup.py) uninstallkey list
    import inspect
    caller_globals = inspect.stack()[1][0].f_globals
    WAPT = caller_globals.get('WAPT',None)
    force = WAPT and WAPT.options.force

    if not min_version:
        min_version = getproductprops(msi)['version']

    if need_install(key,min_version=min_version,force=force):
        if killbefore:
        props = ' '.join(["%s=%s" % (k,v) for (k,v) in properties.iteritems()])
        run(r'msiexec /norestart /q /i "%s" %s' % (msi,props),accept_returncodes=accept_returncodes,timeout=timeout)
        if not installed_softwares(uninstallkey=key):
            error('MSI %s has been installed but the uninstall key %s can not be found' % (msi,key))
        print('MSI %s already installed. Skipping msiexec' % msi)
    if key:
        if 'uninstallkey' in caller_globals and not key in caller_globals['uninstallkey']:

def find_msis(path=None):
    """Returns msi filename and properties"""
    if iswin64():
        if path is None:
            allmsi = glob.glob('*x64*.msi')
            allmsi = glob.glob(makepath(path,'*x64*.msi'))
        if path is None:
            allmsi = glob.glob('*win32*.msi')
            allmsi = glob.glob(makepath(path,'*win32*.msi'))

    result = []
    for msi in allmsi:
        # uninstallkey is in msi db
        props = get_msi_properties(msi)
    return result

def update_control(entry):
    """Magic Callback to update control version data at build step"""
    (version,packaging) = entry.version.split('-',1)
    msis = find_msis()
    # use first msi's version for the package version
    version = msis[0][1]['ProductVersion']
    entry.version = "%s-%s"%(version,packaging)

def install():

    # calc package prefix from current package name
    default_prefix = control.package.split('-',1)[0]
    msi45_package = '%s-msi-4.5'%default_prefix

    # tortoisesvn installer requires newest version of msi on Windows XP
    if platform.win32_ver()[0] == 'XP' and not installed_softwares('KB942288-v3'):
        if WAPT.is_available(msi45_package):
            Exception('%s is not avaible'%msi45_package)

    msis = find_msis()
    for (msi,props) in msis:

    # silent install does not install any icons set for some reason
    for (msi,props) in find_msis('TortoiseOverlays'):