tis-tortoisesvn 1.9.27038-21

  • package : tis-tortoisesvn
  • version : 1.9.27038-21
  • architecture : all
  • locale :
  • 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 : 2018-02-27 19:08:38
  • min_wapt_version :
  • min_os_version :
  • max_os_version :
  • impacted_process :
  • 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'):


No changelog


WAPT/icon.png af22ffab9f39e29286075b3ad95c4ee1a40c24a150bec41176965386d61f0750
TortoiseSVN- d19faba452cb7bbe8efbe3968a0da47dfe65f87d9c1bbed9c0565279ff36c2cb
WAPT/wapt.psproj bc34bb5f85d78dffc7effd37bd0639580a0e140c155973c04d79eb9aa31eb57a
WAPT/certificate.crt 79e5388683c0b6cb03f4f81e4e58e3a11463b2b6cf169dd9c453098027dcfaa4
msioptions.txt 4fb53f1489da9db3155bf58fed285e4f80ed779a0b70f20248b3907ba5d66288
TortoiseOverlays/TortoiseOverlays- 09df0268ef36fe79aae81e05271a375afb3c57f4825d5153646cf910e829c3c9
TortoiseOverlays/TortoiseOverlays- 086557c57ca5d6c96388fd4c1a036f8e018cddb471364d72a6e562a7e955595c
TortoiseOverlays/TortoiseOverlays- 4c8b92b27598c9dd20a76c94f860d9383416cc3ccca7dae719860d5e57e8fb52
TortoiseOverlays/TortoiseOverlays- 05867adf4ac4b2941709529744307bc1b3f3c919851a5dc846c9c8a766a2889c
setup.py c9b58ef84986fe19e9d75acaa031cbe2c7a92a81538ef826228f0a934e6775e8
TortoiseSVN- 5059209b24972d978e80afcac1721aafb560c42c59ed193689eee23563d23850
WAPT/control 54795aeceda848fef47d53a6d105c74c1732d63d27c217c28fb17cffb1462d36