Skip to content
Snippets Groups Projects
deploy.py 7.22 KiB
Newer Older
# -*- coding: utf-8 -*-

"""
***************************************************************************
    deploy.py
    Script to build the HUB-TimeSeriesViewer from Repository code
    ---------------------
    Date                 : September 2017
    Copyright            : (C) 2017 by Benjamin Jakimow
    Email                : benjamin.jakimow@geo.hu-berlin.de
***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
***************************************************************************
"""


from __future__ import absolute_import
import os, sys, re, shutil, zipfile, datetime
from pb_tool import pb_tool
import numpy as np
from timeseriesviewer import DIR_REPO, jp, file_search
import timeseriesviewer
DIR_BUILD = jp(DIR_REPO, 'build')
DIR_DEPLOY = jp(DIR_REPO, 'deploy')




#list of deploy options:
# ZIP - add zipped plugin to DIR_DEPLOY
# UNZIPPED - add the non-zipped plugin to DIR_DEPLOY
DEPLOY_OPTIONS = ['ZIP', 'UNZIPPED']
ADD_TESTDATA = True

#directories below the <enmapbox-repository> folder whose content is to be copied without filtering
PLAIN_COPY_SUBDIRS = ['site-packages']

########## End of config section
timestamp = ''.join(np.datetime64(datetime.datetime.now()).astype(str).split(':')[0:-1])
buildID = '{}.{}'.format(timeseriesviewer.VERSION, timestamp)
dirBuildPlugin = jp(DIR_BUILD, 'timeseriesviewerplugin')

def rm(p):
    """
    Remove files or directory 'p'
    :param p: path of file or directory to be removed.
    """
    if os.path.isfile(p):
        os.remove(p)
    elif os.path.isdir(p):
        shutil.rmtree(p)

def cleanDir(d):
    """
    Remove content from directory 'd'
    :param d: directory to be cleaned.
    """
    assert os.path.isdir(d)
    for root, dirs, files in os.walk(d):
        for p in dirs + files: rm(jp(root,p))
        break

def mkDir(d, delete=False):
    """
    Make directory.
    :param d: path of directory to be created
    :param delete: set on True to delete the directory contents, in case the directory already existed.
    """
    if delete and os.path.isdir(d):
        cleanDir(d)
    if not os.path.isdir(d):
        os.makedirs(d)

Benjamin Jakimow's avatar
Benjamin Jakimow committed
def patch_pb_tool(DIR_DEPLOY):

    #local pb_tool configuration file.
    pathCfg = jp(DIR_REPO, 'pb_tool.cfg')

    #required to choose andy DIR_DEPLOY of choice
    #issue tracker: https://github.com/g-sherman/plugin_build_tool/issues/4
    pb_tool.get_plugin_directory = lambda : DIR_DEPLOY
    pb_tool.cli.command = lambda f:f
    #Issue 1.: set pb_tool.cfg directly and do not expect current WDir
    def config():
        import ConfigParser
        cfg = ConfigParser.ConfigParser()
        cfg.read(pathCfg)
        return cfg
    pb_tool.config = config

    #issue 2: do not expect compiled resource files to end on '_rc.py'
    def compiled_resource():
        return []
        import ConfigParser
        cfg = config()
        try:
            res_files = cfg.get('files', 'resource_files').split()
            compiled = []
            for res in res_files:
                (base, ext) = os.path.splitext(res)

                #CHANGED!!!! no '_rc.py'
                compiled.append('{}.py'.format(base))
            # print "Compiled resource files: {}".format(compiled)
            return compiled
        except ConfigParser.NoSectionError as oops:
            print oops.message
            sys.exit(1)
    pb_tool.compiled_resource = compiled_resource

    #Issues:
    #def compiled_ui():
    #    return []
    #    files = file_search(jp(DIR_REPO,'timeseriesviewer'), '*.ui', recursive=True)
    #    return files
    #pb_tool.compiled_ui = compiled_ui

    #Issues:
    _deployOld = pb_tool.deploy
    def deploy():
        #create target directories
        plugin_dir = os.path.join(pb_tool.get_plugin_directory(), pb_tool.config().get('plugin', 'name'))
        install_files = pb_tool.get_install_files()

        for file in install_files:
            d = os.path.dirname(jp(plugin_dir,file))
            if not os.path.exists(d):
                os.makedirs(d)
        _deployOld()
    pb_tool.deploy = deploy


    #Issue: my 'help' dir is called 'doc'
    def build_docs():
        """ Build the docs using sphinx"""
        import subprocess
        helpDir = jp(DIR_REPO, 'doc')
        #if os.path.exists('help'):

        if os.path.exists(helpDir):
            if sys.platform == 'win32':
                makeprg = 'make.bat'
            else:
                makeprg = 'make'
            cwd = os.getcwd()
            os.chdir(helpDir)
            subprocess.check_call([makeprg, 'html'])
            os.chdir(cwd)
        else:
            print "No help directory exists in the current directory"
    pb_tool.build_docs = build_docs

if __name__ == "__main__":


    #the directory to build the "enmapboxplugin" folder
    DIR_DEPLOY = jp(DIR_REPO, 'deploy')
Benjamin Jakimow's avatar
Benjamin Jakimow committed
    mkDir(DIR_DEPLOY)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
    # DIR_DEPLOY = r'E:\_EnMAP\temp\temp_bj\enmapbox_deploys\most_recent_version'

    #patch_pb_tool(DIR_DEPLOY)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
    pathCfg = jp(DIR_REPO, 'pb_tool.cfg')
    cfg = pb_tool.get_config(pathCfg)
    cdir = os.path.dirname(pathCfg)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
    pluginname = cfg.get('plugin', 'name')
    dirPlugin = jp(DIR_DEPLOY, pluginname)
        #1. clean an existing directory = the timeseriesviewer folder
        os.chdir(cdir)
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        pb_tool.clean_deployment(ask_first=False)

        #2. Compile. Basically call pyrcc to create the resources.rc file
        #I don't know how to call this from pure python
Benjamin Jakimow's avatar
Benjamin Jakimow committed
        if False:
            import subprocess
            import make
            os.chdir(DIR_REPO)
            subprocess.call(['pb_tool', 'compile'])
            make.compile_rc_files(DIR_REPO)
            pb_tool.compile_files(cfg)
Benjamin Jakimow's avatar
Benjamin Jakimow committed

        #3. Deploy = write the data to the new enmapboxplugin folder
        pb_tool.deploy_files(pathCfg,DIR_DEPLOY, quick=True, confirm=False)
        #4. As long as we can not specify in the pb_tool.cfg which file types are not to deploy,
        # we need to remove them afterwards.
        # issue: https://github.com/g-sherman/plugin_build_tool/issues/5
        print('Remove files...')
        for f in file_search(DIR_DEPLOY, re.compile('(svg|pyc)$'), recursive=True):
            os.remove(f)
    #5. create a zip
    print('Create zipfile...')
    from timeseriesviewer.utils import zipdir
Benjamin Jakimow's avatar
Benjamin Jakimow committed

    pathZip = jp(DIR_DEPLOY, '{}.{}.zip'.format(pluginname,timestamp))
    zipdir(dirPlugin, pathZip)
    #os.chdir(dirPlugin)
    #shutil.make_archive(pathZip, 'zip', '..', dirPlugin)

    # 6. copy to local QGIS user DIR
    if True:
        import shutil

        from os.path import expanduser

        pathQGIS = os.path.join(expanduser("~"), *['.qgis2', 'python', 'plugins'])

        assert os.path.isdir(pathQGIS)
        pathDst = os.path.join(pathQGIS, os.path.basename(dirPlugin))
        rm(pathDst)
        shutil.copytree(dirPlugin, pathDst)
        s = ""

    print('Finished')