buildframework/helium/sf/python/pythoncore/lib/ccm/__init__.py
author wbernard
Tue, 27 Apr 2010 08:33:08 +0300
changeset 587 85df38eb4012
child 588 c7c26511138f
child 618 df88fead2976
permissions -rw-r--r--
helium_9.0-a7879c935424
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
#============================================================================ 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
#Name        : __init__.py 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
#Part of     : Helium 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
#All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
#This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
#under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
#which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
#at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
#Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
#Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
#Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
#Description:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
#===============================================================================
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
""" CM/Synergy Python toolkit.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    24
import logging
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import netrc
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
import os
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
import re
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
import subprocess
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
import threading
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
import fileutils
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
import nokia.gscm
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
import tempfile
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
import socket
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
# Uncomment this line to enable logging in this module, or configure logging elsewhere
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
_logger = logging.getLogger("ccm")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
#logging.basicConfig(level=logging.DEBUG)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    41
VALID_OBJECT_STATES = ('working', 'checkpoint', 'public', 'prep', 'integrate', 'sqa', 'test','released')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
STATIC_OBJECT_STATES = ('integrate', 'sqa', 'test','released')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
CCM_SESSION_LOCK = os.path.join(tempfile.gettempdir(), "ccm_session.lock")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    45
def _execute(command, timeout=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
    """ Runs a command and returns the result data. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
    targ = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
    if timeout is not None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
        targ = "--timeout=%s" % timeout
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
    process = subprocess.Popen("python -m timeout_launcher %s -- %s" % (targ, command), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
    stdout = process.communicate()[0]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
    process.wait()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
    _logger.debug(stdout)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
    _logger.debug("Return code: %s" % process.returncode)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
    return (stdout, process.returncode)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
   
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
   
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
class CCMException(Exception):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
    """ Base exception that should be raised by methods of this framework. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
    def __init__(self, reason, result = None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
        Exception.__init__(self, reason)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
        self.result = result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
class Result(object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
    """Class that abstracts ccm call result handling.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
    Subclass it to implement a new generic output parser.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
        self._session = session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
        self.status = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
        self._output = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
        self._output_str = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
        self._output = output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
    def __setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
        """ Internal function to allow overloading, you must override _setoutput.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
        # the output is automatically converted to ascii before any treatment 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
        if isinstance(output, unicode):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
            self._output_str = output.encode('ascii', 'replace')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
            self._output_str = output.decode('ascii', 'ignore')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    88
        _logger.debug("output ---->")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
        for line in self._output_str.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
            _logger.debug(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
        _logger.debug("<----")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
        self._setoutput(self._output_str)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
    def _getoutput(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
        """ Returns the content of _output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
        return self._output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
    def __str__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
        """ Synergy output log. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
        return self._output_str.encode('ascii', 'replace')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   102
    output = property(_getoutput, __setoutput)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
class ResultWithError(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
    """ A result class to parse output errors """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
        self._error = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
        self._error_str = None    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
    def _seterror(self, error):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
        """set the error """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
        self._error = error
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
    def __seterror(self, error):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
        """ Internal function to allow overloading, you must override _seterror.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
        # the error output is automatically converted to ascii before any treatment 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
        if isinstance(error, unicode):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
            self._error_str = error.encode('ascii', 'replace')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
            self._error_str = error.decode('ascii', 'ignore')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
        _logger.debug("error ---->")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
        for line in self._error_str.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
            _logger.debug(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
        _logger.debug("<----")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
        self._seterror(self._error_str)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
    def _geterror(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
        """ Returns the content of _output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
        _logger.debug("_geterror")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   132
        return self._error
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   134
    error = property(_geterror, __seterror)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   135
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   136
class ProjectCheckoutResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   137
    """ Project checkout output parser. 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   138
        Sets project to the created project or None if failed.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   139
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   140
    def __init__(self, session, project):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   141
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   142
        self.__project = project
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   143
        self.__result_project = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   144
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   145
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   146
        """ Parsing the output of the checkout command. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   147
        self._output = output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   148
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   149
            mresult = re.match(r"Saved work area options for project: '(.+)'", line, re.I)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   150
            #(?P<name>.+)-(?P<version>.+?)(:(?P<type>\S+):(?P<instance>\S+))?
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   151
            if mresult != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   152
                #self.__project.name + "-" + mo.groupdict()['version'] + ":" + self.__project.type + ":" + self.__project.instance
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   153
                self.__result_project = self._session.create(mresult.group(1))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   154
                _logger.debug("ProjectCheckoutResult: project: '%s'" % self.__result_project)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   155
                return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   156
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   157
    def __get_result_project(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   158
        """ return the checked out project. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   159
        return self.__result_project
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   160
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   161
    project = property(__get_result_project)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   162
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   163
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   164
class ProjectPurposeResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   165
    """ Parses purpose query output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   166
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   167
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   168
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   169
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   170
        """set output """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   171
        self._output = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   172
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   173
            mresult = re.match(r"(?P<purpose>.+?)\s+(?P<member_status>\w+)\s+(?P<status>\w+)$", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   174
            if mresult != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   175
                data = mresult.groupdict()                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   176
                if re.match(r'^\s+Purpose\s+Member$', data['purpose'], re.I) == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   177
                    self._output[data['purpose'].strip()] = {'member_status' : data['member_status'].strip(),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   178
                                                  'status' : data['status'].strip()}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   179
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   180
class ConflictsResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   181
    """ Parses purpose query output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   182
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   183
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   184
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   185
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   186
        """ set output """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   187
        self._output = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   188
        project = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   189
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   190
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   191
            mresult = re.match(r"Project:\s*(.+)\s*$", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   192
            if mresult != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   193
                project = self._session.create(mresult.group(1))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   194
                self._output[project] = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   195
            mresult = re.match(r"^(.*)\s+(\w+#\d+)\s+(.+)$", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   196
            if mresult != None and project != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   197
                self._output[project].append({'object': self._session.create(mresult.group(1)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   198
                                              'task': self._session.create("Task %s" % mresult.group(2)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   199
                                              'comment': mresult.group(3)})
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   200
            mresult = re.match(r"^(\w+#\d+)\s+(.+)$", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   201
            if mresult != None and project != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   202
                self._output[project].append({'task': self._session.create("Task %s" % mresult.group(1)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   203
                                              'comment': mresult.group(2)})
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   204
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   205
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   206
class FinduseResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   207
    """ Parses finduse query output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   208
    def __init__(self, ccm_object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   209
        Result.__init__(self, ccm_object.session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   210
        self.__object = ccm_object
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   211
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   212
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   213
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   214
        self._output = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   215
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   216
            _logger.debug("FinduseResult: ---->%s<----" % line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   217
            _logger.debug("FinduseResult: ---->%s-%s<----" % (self.__object.name, self.__object.version))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   218
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   219
            # MCNaviscroll\NaviAnim-username7@MCNaviscroll-username6            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   220
            mresult = re.match(r"^\s*(?P<path>.+)[\\/]%s-%s@(?P<project>.+)" % (self.__object.name, self.__object.version), line, re.I)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   221
            if mresult != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   222
                data = mresult.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   223
                _logger.debug("FinduseResult: %s" % data)               
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   224
                project = self._session.create(data['project'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   225
                self._output.append({'path' : data['path'], 'project' : project})
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   226
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   227
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   228
class UpdateTemplateInformation(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   229
    """ Parse update template information output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   230
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   231
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   232
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   233
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   234
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   235
Baseline Selection Mode: Latest Baseline Projects
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   236
Prep Allowed:            No
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   237
Versions Matching:       *abs.50*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   238
Release Purposes:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   239
Use by Default:          Yes
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   240
Modifiable in Database:  tr1s60
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   241
In Use For Release:      Yes
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   242
Folder Templates and Folders:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   243
- Template assigned or completed tasks for %owner for release %release
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   244
- Template all completed tasks for release %release
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   245
- Folder   tr1s60#4844: All completed Xuikon/Xuikon_rel_X tasks
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   246
- Folder   tr1s60#4930: All tasks for release AppBaseDo_50        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   247
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   248
        self._output = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   249
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   250
            rmo = re.match(r"^\s*(.+):\s*(.*)\s*", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   251
            if rmo != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   252
                if rmo.group(1) == "Baseline Selection Mode":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   253
                    self._output['baseline_selection_mode'] = rmo.group(2) 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   254
                elif rmo.group(1) == "Prep Allowed":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   255
                    self._output['prep_allowed'] = (rmo.group(2) != "No") 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   256
                elif rmo.group(1) == "Versions Matching":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   257
                    self._output['version_matching'] = rmo.group(2) 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   258
                elif rmo.group(1) == "Release Purposes":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   259
                    self._output['release_purpose'] = rmo.group(2) 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   260
                elif rmo.group(1) == "Use by Default":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   261
                    self._output['default'] = (rmo.group(2) != "No") 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   262
                elif rmo.group(1) == "Modifiable in Database":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   263
                    self._output['modifiable_in_database'] = rmo.group(2).strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   264
                elif rmo.group(1) == "In Use For Release":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   265
                    self._output['in_use_for_release'] = (rmo.group(2) != "No") 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   266
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   267
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   268
class UpdatePropertiesRefreshResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   269
    """ Parse update template refresh output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   270
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   271
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   272
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   273
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   274
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   275
        self._output = {'added': [], 'removed': []}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   276
        match_added = re.compile(r"^Added the following tasks")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   277
        match_removed = re.compile(r"^Removed the following tasks")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   278
        match_task_new = re.compile(r"^\s+(Task \S+#\d+)")        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   279
        section = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   280
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   281
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   282
            res = match_added.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   283
            if res != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   284
                section = 'added'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   285
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   286
            res = match_removed.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   287
            if res != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   288
                section = 'removed'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   289
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   290
            if section is not None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   291
                res = match_task_new.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   292
                if res != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   293
                    self._output[section].append(self._session.create(res.group(1)))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   294
                    continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   295
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   296
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   297
class UpdateResultSimple(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   298
    """ Parse update output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   299
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   300
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   301
        self._success = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   302
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   303
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   304
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   305
        self._output = output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   306
        match_failed = re.compile(r"(Update failed)")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   307
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   308
            res = match_failed.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   309
            if res != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   310
                self._success = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   311
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   312
    @property
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   313
    def successful(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   314
        """successful"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   315
        return self._success
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   316
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   317
class UpdateResult(UpdateResultSimple):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   318
    """ Parse update output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   319
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   320
        UpdateResultSimple.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   321
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   322
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   323
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   324
        self._output = {"tasks":[], "modifications": [], "errors": [], "warnings": []}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   325
        match_object_update = re.compile(r"^\s+'(.*)'\s+replaces\s+'(.*)'\s+under\s+'(.*)'\.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   326
        match_object_new = re.compile(r"^\s+(?:Subproject\s+)?'(.*)'\s+is now bound under\s+'(.*)'\.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   327
        match_task_new = re.compile(r"^\s+(Task \S+#\d+)")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   328
        match_no_candidate = re.compile(r"^\s+(.+) in project (.+) had no candidates")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   329
        match_update_failure = re.compile(r"^\s+Failed to use selected object\s+(.+)\s+under directory\s+(.+)\s+in project\s+(.+)\s+:\s+(.+)")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   330
        match_warning = re.compile(r"^Warning:(.*)")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   331
        match_failed = re.compile(r"(Update failed)")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   332
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   333
        # TODO: cleanup the parsing to do that in a more efficient way.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   334
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   335
            _logger.info(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   336
            res = match_object_update.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   337
            if res != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   338
                self._output['modifications'].append({ "new": self._session.create(res.group(1)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   339
                                      "old": self._session.create(res.group(2)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   340
                                      "project": self._session.create(res.group(3))})
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   341
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   342
            res = match_object_new.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   343
            if res != None:                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   344
                self._output['modifications'].append({ "new": self._session.create(res.group(1)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   345
                                      "old": None,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   346
                                      "project": self._session.create(res.group(2))})
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   347
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   348
            res = match_task_new.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   349
            if res != None:                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   350
                self._output['tasks'].append(self._session.create(res.group(1)))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   351
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   352
            res = match_no_candidate.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   353
            if res != None:                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   354
                self._output['errors'].append({'family': res.group(1),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   355
                                               'project': self._session.create(res.group(2)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   356
                                               'comment': "had no candidates",
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   357
                                               'line': line,})
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   358
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   359
            res = match_update_failure.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   360
            if res != None:                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   361
                self._output['errors'].append({'family': res.group(1),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   362
                                               'dir': self._session.create(res.group(2)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   363
                                               'project': self._session.create(res.group(3)),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   364
                                               'comment': res.group(4),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   365
                                               'line': line,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   366
                                               })
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   367
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   368
            res = match_warning.match(line)            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   369
            if res != None:                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   370
                self._output['warnings'].append({'family': None,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   371
                                               'project': None,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   372
                                               'comment': res.group(1),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   373
                                               'line': line,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   374
                                               })
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   375
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   376
            res = match_failed.match(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   377
            if res != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   378
                self._success = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   379
                self._output['errors'].append({'Serious': res.group(1),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   380
                                               })
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   381
                continue
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   382
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   383
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   384
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   385
class WorkAreaInfoResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   386
    """ Parse work area info output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   387
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   388
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   389
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   390
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   391
        """ Returns a dict with the following fields:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   392
               * project: a ccm.Project instance
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   393
               * maintain: a boolean
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   394
               * copies: a boolean
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   395
               * relative: a boolean
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   396
               * time: a boolean
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   397
               * translate: a boolean
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   398
               * modify: a boolean
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   399
               * path: a string representing the project wa path
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   400
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   401
        self._output = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   402
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   403
            mresult = re.match(r"(?P<project>.*)\s+(?P<maintain>TRUE|FALSE)\s+(?P<copies>TRUE|FALSE)\s+(?P<relative>TRUE|FALSE)\s+(?P<time>TRUE|FALSE)\s+(?P<translate>TRUE|FALSE)\s+(?P<modify>TRUE|FALSE)\s+'(?P<path>.*)'", line)            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   404
            if mresult != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   405
                data = mresult.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   406
                self._output = {'project': self._session.create(data['project']),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   407
                                'maintain' : data['maintain'] == "TRUE",
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   408
                                'copies' : data['copies'] == "TRUE",
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   409
                                'relative' : data['relative'] == "TRUE",
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   410
                                'time' : data['time'] == "TRUE",
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   411
                                'translate' : data['translate'] == "TRUE",
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   412
                                'modify' : data['modify'] == "TRUE",
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   413
                                'path' : data['path']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   414
                                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   415
                return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   416
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   417
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   418
class CreateNewTaskResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   419
    """ A result class to parse newly created tasks """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   420
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   421
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   422
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   423
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   424
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   425
        self._output = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   426
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   427
            mresult = re.match(r"Task\s+(?P<task>\S+\#\d+)\s+created\.", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   428
            if mresult != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   429
                self._output = self._session.create("Task " + mresult.groupdict()['task'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   430
                return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   431
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   432
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   433
class AttributeNameListResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   434
    """ Class that abstract ccm call result handling.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   435
        Subclass it to implement a new generic output parser.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   436
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   437
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   438
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   439
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   440
    def _setoutput(self, obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   441
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   442
        def _create(arg):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   443
            """create"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   444
            mresult = re.match(r"^\s*(?P<name>\w+)", arg.strip())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   445
            if mresult != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   446
                return mresult.groupdict()['name']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   447
            return None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   448
        self._output = [_create(line) for line in obj.strip().splitlines()]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   449
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   450
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   451
class ObjectListResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   452
    """ Parses an object list Synergy output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   453
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   454
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   455
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   456
    def _setoutput(self, obj):        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   457
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   458
        self._output = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   459
        if re.match(r"^None|^No tasks|^Warning", obj, re.M) != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   460
            return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   461
        def _create(arg):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   462
            """create"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   463
            arg = arg.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   464
            if arg != "":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   465
                return self._session.create(arg)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   466
            return None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   467
        result = [_create(line) for line in obj.strip().splitlines()]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   468
        for result_line in result:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   469
            if result_line != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   470
                self._output.append(result_line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   471
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   472
class DataMapperListResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   473
    """ Parses an object list Synergy output. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   474
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   475
    dataconv = {'ccmobject': lambda x, y: x.create(y),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   476
                'string': lambda x, y: y,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   477
                'int': lambda x, y: int(y),
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   478
                'boolean': lambda x, y: (y.lower() == "true")}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   479
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   480
    def __init__(self, session, separator, keywords, datamodel):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   481
        self._separator = separator
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   482
        self._keywords = keywords
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   483
        self._datamodel = datamodel
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   484
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   485
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   486
    def format(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   487
        """format keywords"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   488
        formatted_keywords = ["%s%s%s%%%s" % (self._separator, x, self._separator, x) for x in self._keywords]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   489
        return "".join(formatted_keywords) + self._separator
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   490
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   491
    def regex(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   492
        """regular expression"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   493
        regex_keywords = [r'%s%s%s(.*?)' % (self._separator, x, self._separator) for x in self._keywords]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   494
        regex = r''.join(regex_keywords)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   495
        regex = r"%s%s\s*\n" % (regex, self._separator)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   496
        return re.compile(regex, re.MULTILINE | re.I | re.DOTALL | re.VERBOSE | re.U)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   497
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   498
    def _setoutput(self, obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   499
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   500
        self._output = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   501
        regex = self.regex()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   502
        _logger.debug("Regex %s" % (regex.pattern))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   503
        for match in regex.finditer(obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   504
            _logger.debug("Found: %s" % (match))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   505
            if match != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   506
                output_line = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   507
                for i in range(len(self._datamodel)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   508
                    _logger.debug("Found %d: %s" % (i, match.group(i + 1)))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   509
                    model = self._datamodel[i]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   510
                    output_line[self._keywords[i]] = self.dataconv[model](self._session, match.group(i + 1))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   511
                    i += 1
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   512
                self._output.append(output_line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   513
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   514
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   515
class FolderCopyResult(Result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   516
    """ Parses a folder copy result """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   517
    def __init__(self, session):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   518
        Result.__init__(self, session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   519
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   520
    def _setoutput(self, output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   521
        """set output"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   522
        self._output = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   523
        for line in output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   524
            match_output = re.match(r"appended to", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   525
            if match_output != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   526
                self._output = self._session.create(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   527
                return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   528
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   529
CHECKOUT_LOG_RULES = [[r'^Derive failed for', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   530
                      [r'^Serious:', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   531
                      [r'^Warning: .* failed.', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   532
                      [r'^Invalid work area', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   533
                      [r'^WARNING:', logging.WARNING],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   534
                      [r'^Warning:', logging.WARNING],]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   535
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   536
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   537
UPDATE_LOG_RULES = [[r'^Update failed.', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   538
                    [r'^Serious:', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   539
                    [r'^\s+Failed to', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   540
                    [r'^\d+ failures to', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   541
                    [r"^Warning: This work area '.+' cannot be reused", logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   542
                    [r'^Rebind of .* failed', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   543
                    [r'^Warning: .* failed.', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   544
                    [r'^Skipping \'.*\'\.  You do not have permission to modify this project.', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   545
                    [r'^Work area conflict exists for file', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   546
                    [r'^Warning:  No candidates found for directory entry', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   547
                    [r'^WARNING:', logging.WARNING],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   548
                    [r'^Warning:', logging.WARNING],]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   549
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   550
CONFLICTS_LOG_RULES = [[r'^\w+#\d+\s+Implicit', logging.WARNING],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   551
                       [r'^(.*)\s+(\w+#\d+)\s+(.+)', logging.WARNING],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   552
                       [r'.*Explicitly specified but not included', logging.WARNING],]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   553
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   554
SYNC_LOG_RULES = [[r'^\s+0\s+Conflict\(s\) for project', logging.INFO],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   555
                  [r'^\s+\d+\s+Conflict\(s\) for project', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   556
                  [r'^Project \'.*\' does not maintain a workarea.', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   557
                  [r'^Work area conflict exists for file', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   558
                  [r'^Warning: Conflicts detected during synchronization. Check your logs.', logging.ERROR],
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   559
                  [r'^Warning:', logging.WARNING],]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   560
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   561
def log_result(result, rules, logger=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   562
    """ Rules it a list of tuple defining a regular expression and an log level. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   563
    if logger is None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   564
        logger = _logger
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   565
    crules = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   566
    if rules is not None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   567
        for rule in rules:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   568
            crules.append([re.compile(rule[0]), rule[1]])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   569
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   570
    for line in str(result).splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   571
        for rule in crules:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   572
            if rule[0].match(line) != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   573
                logger.log(rule[1], line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   574
                break
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   575
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   576
            logger.info(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   577
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   578
class AbstractSession(object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   579
    """An abstract Synergy session.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   580
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   581
    Must be overridden to implement either a single session or
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   582
    multiple session handling.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   583
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   584
    def __init__(self, username, engine, dbpath, ccm_addr):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   585
        self.username = username
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   586
        self.engine = engine
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   587
        self.dbpath = dbpath
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   588
        self._session_addr = ccm_addr
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   589
        # internal object list
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   590
        self.__ccm_objects = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   591
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   592
    def addr(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   593
        """ Returns the Synergy session id."""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   594
        return self._session_addr
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   595
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   596
    def database(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   597
        """database"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   598
        _logger.debug("AbstractSession: database")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   599
        self.__find_dbpath()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   600
        _logger.debug("AbstractSession: database: %s" % self.dbpath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   601
        return os.path.basename(self.dbpath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   602
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   603
    def __find_dbpath(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   604
        """ retrieve the database path from current session status. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   605
        _logger.debug("AbstractSession: __find_dbpath")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   606
        if (self.dbpath != None):            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   607
            return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   608
        result = self.execute("status")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   609
        for match in re.finditer(r'(?:(?:Graphical)|(?:Command)) Interface\s+@\s+(?P<ccmaddr>\w+:\d+(?:\:\d+\.\d+\.\d+\.\d+)+)(?P<current_session>\s+\(current\s+session\))?\s*\nDatabase:\s*(?P<dbpath>\S+)', result.output, re.M | re.I):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   610
            dictionary = match.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   611
            if (dictionary['current_session'] != None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   612
                _logger.debug("AbstractSession: __find_dbpath: Found dbpath: %s" % dictionary['dbpath'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   613
                self.dbpath = dictionary['dbpath']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   614
        assert self.dbpath != None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   615
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   616
    def execute(self, _, result=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   617
        """ Abstract function that should implement the execution of ccm command
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   618
            line call.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   619
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   620
        return result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   621
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   622
    def create(self, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   623
        """ Object factory, this is the toolkit entry point to create objects from
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   624
            four part names. Objects are stored into a dictionary, so you have
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   625
            only one wrapper per synergy object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   626
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   627
        result = re.search(r"^(?P<project>.+)-(?P<version>[^:]+?)$", fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   628
        if result != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   629
            matches = result.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   630
            fpn = "%s-%s:project:%s#1" % (matches['project'], matches['version'], self.database())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   631
        _logger.debug("session.create('%s')" % fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   632
        ofpn = FourPartName(fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   633
        if not self.__ccm_objects.has_key(str(fpn)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   634
            obj = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   635
            if ofpn.type == 'project':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   636
                obj = Project(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   637
            elif ofpn.type == 'dir':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   638
                obj = Dir(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   639
            elif ofpn.type == 'task':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   640
                obj = Task(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   641
            elif ofpn.type == 'folder':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   642
                obj = Folder(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   643
            elif ofpn.type == 'releasedef':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   644
                obj = Releasedef(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   645
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   646
                obj = File(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   647
            self.__ccm_objects[str(fpn)] = obj
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   648
        return self.__ccm_objects[str(fpn)]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   649
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   650
    def get_workarea_info(self, dir_):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   651
        """ Return a dictionary containing workarea info from directory dir.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   652
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   653
        if (not os.path.exists(dir_)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   654
            raise CCMException("Error retrieving work_area info for the directory '%s' (doesn't exists)" % dir_)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   655
        path = os.path.abspath(os.path.curdir)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   656
        path_ccmwaid = os.path.join(dir_,"_ccmwaid.inf")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   657
        if(not os.path.exists(path_ccmwaid)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   658
            raise CCMException("No work area in '%s'" % dir_)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   659
        os.chdir(dir_)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   660
        result = self.execute("wa -show", WorkAreaInfoResult(self))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   661
        os.chdir(path)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   662
        if result.output == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   663
            raise CCMException("Error retrieving work_area info for the directory '%s'" % dir_)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   664
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   665
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   666
    def _get_role(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   667
        """get CCM role"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   668
        result = self.execute("set role")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   669
        return result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   670
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   671
    def _set_role_internal(self, role):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   672
        """ method to be override by child class else property accession is not working properly. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   673
        if  role == None or len(role) == 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   674
            raise CCMException("You must provide a role.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   675
        result = self.execute("set role %s" % role)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   676
        if re.match(r'^Warning:', result.output, re.M) != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   677
            raise CCMException("Error switching to role %s: %s" %(role, result.output.strip()))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   678
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   679
    def _set_role(self, role):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   680
        """set CCM role"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   681
        self._set_role_internal(role)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   682
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   683
    role = property(fget=_get_role, fset=_set_role)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   684
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   685
    def _get_home(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   686
        """get home"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   687
        result = self.execute("set Home")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   688
        return result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   689
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   690
    def _set_home(self, home):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   691
        """set home"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   692
        if len(home) == 0 or home == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   693
            raise CCMException("You must provide a home.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   694
        result = self.execute("set Home %s" % home)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   695
        if re.match(r'^Warning:', result.output, re.M) != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   696
            raise CCMException("Error switching to Home %s: %s" %(home, result.output.strip()))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   697
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   698
    home = property(_get_home, _set_home)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   699
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   700
    def close(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   701
        """close does nothing"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   702
        pass
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   703
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   704
    def __str__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   705
        self.__find_dbpath()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   706
        return self._session_addr + ':' + self.dbpath
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   707
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   708
    def __repr__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   709
        return self.__str__()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   710
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   711
    def __del__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   712
        self.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   713
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   714
    def purposes(self, role=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   715
        """ Returns available purposes. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   716
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   717
        if role != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   718
            args = "-role \"%s\"" % role
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   719
        result = self.execute("project_purpose -show %s" % args, ProjectPurposeResult(self))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   720
        return result.output        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   721
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   722
class Session(AbstractSession):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   723
    """A Synergy session.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   724
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   725
    def __init__(self, username, engine, dbpath, ccm_addr, close_on_exit=True):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   726
        AbstractSession.__init__(self, username, engine, dbpath, ccm_addr)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   727
        self._execute_lock = threading.Lock()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   728
        self.close_on_exit = close_on_exit
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   729
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   730
    @staticmethod
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   731
    def start(username, password, engine, dbpath, timeout=300):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   732
        """start the session"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   733
        if username == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   734
            raise CCMException('username is not valid')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   735
        if password == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   736
            raise CCMException('password is not valid')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   737
        if CCM_BIN == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   738
            raise CCMException("Could not find CM/Synergy executable in the path.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   739
        command = "%s start -m -q -nogui -n %s -pw %s -h %s -d %s" % \
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   740
                    (CCM_BIN, username, password, engine, dbpath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   741
        _logger.debug('Starting new session:' + command.replace(password, "***"))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   742
        (result, status) = _execute(command, timeout=timeout)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   743
        if status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   744
            raise Exception("Error creating a session: result:\n%s\nCommand: %s" % (result, command.replace(password, "***")))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   745
        session_addr = result.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   746
        _logger.debug(session_addr)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   747
        if not re.match(r'[a-zA-Z0-9_\-.]+:\d+:\d+\.\d+\.\d+\.\d+(:\d+\.\d+\.\d+\.\d+)?', session_addr):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   748
            raise Exception("Error creating a session: result:\n%s" % result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   749
        return Session(username, engine, dbpath, session_addr)        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   750
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   751
    def execute(self, cmdline, result=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   752
        """ Executes a Synergy CLI operation. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   753
        if self._session_addr == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   754
            raise CCMException("No Synergy session running")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   755
        if CCM_BIN == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   756
            raise CCMException("Could not find CM/Synergy executable in the path.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   757
        self._execute_lock.acquire()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   758
        output = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   759
        error = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   760
        try:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   761
            if result == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   762
                result = Result(self)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   763
            if os.sep == '\\':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   764
                command = "set CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " %s" % cmdline
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   765
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   766
                command = "export CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " %s" % cmdline
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   767
            _logger.debug('Execute > ' + command)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   768
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   769
            if hasattr(result, 'error'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   770
                process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   771
                output = process.stdout.read()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   772
                error = process.stderr.read()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   773
                result.status = process.returncode
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   774
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   775
                process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   776
                output = process.stdout.read()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   777
                result.status = process.returncode
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   778
        finally:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   779
            self._execute_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   780
        result.output = output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   781
        if hasattr(result, 'error'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   782
            result.error = error.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   783
        return result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   784
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   785
    def close(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   786
        """ Closes this Synergy session if it was not previously running anyway. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   787
        _logger.debug("Closing session %s" % self._session_addr)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   788
        if self._session_addr != None and self.close_on_exit:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   789
            _logger.debug("Closing session %s" % self._session_addr)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   790
            self._execute_lock.acquire()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   791
            if os.sep == '\\':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   792
                command = "set CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " stop"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   793
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   794
                command = "export CCM_ADDR=" + self._session_addr + " && " + CCM_BIN + " stop"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   795
            _logger.debug('Execute > ' + command)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   796
            pipe = os.popen(command)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   797
            pipe.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   798
            self._session_addr = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   799
            self._execute_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   800
        elif self._session_addr != None and not self.close_on_exit:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   801
            _logger.debug("Keeping session %s alive." % self._session_addr)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   802
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   803
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   804
class SessionPool(AbstractSession):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   805
    """ Session that transparently handled several subsession, to easily enable
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   806
        multithreaded application.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   807
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   808
    def __init__(self, username, password, engine, dbpath, database=None, size=4, opener=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   809
        AbstractSession.__init__(self, username, engine, dbpath, None)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   810
        self._opener = opener
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   811
        if self._opener is None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   812
            self._opener = open_session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   813
        self._free_sessions = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   814
        self._used_sessions = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   815
        self._thread_sessions = {}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   816
        self._pool_lock = threading.Condition()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   817
        self._lock_pool = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   818
        self.__password = password
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   819
        self.__database = database        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   820
        self.size = size
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   821
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   822
    def _set_size(self, size):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   823
        """ Set the pool size """ 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   824
        self._pool_lock.acquire()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   825
        poolsize = len(self._free_sessions) + len(self._used_sessions)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   826
        if  poolsize > size:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   827
            to_be_remove = poolsize - size
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   828
            self._lock_pool = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   829
            while len(self._free_sessions) < to_be_remove:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   830
                self._pool_lock.wait()            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   831
            for _ in range(to_be_remove):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   832
                self._free_sessions.pop().close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   833
            self._lock_pool = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   834
        else: 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   835
            for _ in range(size - poolsize):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   836
                self._free_sessions.append(self._opener(self.username, self.__password, self.engine, self.dbpath, self.__database, False))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   837
        self._pool_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   838
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   839
    def _get_size(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   840
        """get pool size"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   841
        self._pool_lock.acquire()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   842
        poolsize = len(self._free_sessions) + len(self._used_sessions)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   843
        self._pool_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   844
        return poolsize
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   845
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   846
    size = property (_get_size, _set_size)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   847
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   848
    def execute(self, cmdline, result=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   849
        """ Executing a ccm command on a free session. """        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   850
        _logger.debug("SessionPool:execute: %s %s" % (cmdline, type(result)))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   851
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   852
        # waiting for a free session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   853
        self._pool_lock.acquire()        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   854
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   855
        # check for recursion, in that case reallocate the same session,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   856
        if threading.currentThread() in self._thread_sessions:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   857
            _logger.debug("Same thread, reusing allocation session.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   858
            # release the pool and reuse associated session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   859
            self._pool_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   860
            return self._thread_sessions[threading.currentThread()].execute(cmdline, result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   861
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   862
        while len(self._free_sessions)==0 or self._lock_pool:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   863
            self._pool_lock.wait()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   864
        session = self._free_sessions.pop(0)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   865
        self._used_sessions.append(session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   866
        self._thread_sessions[threading.currentThread()] = session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   867
        self._pool_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   868
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   869
        # running command
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   870
        try:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   871
            result = session.execute(cmdline, result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   872
        finally:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   873
            # we can now release the session - anyway
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   874
            self._pool_lock.acquire()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   875
            self._thread_sessions.pop(threading.currentThread())                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   876
            self._used_sessions.remove(session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   877
            self._free_sessions.append(session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   878
            self._pool_lock.notifyAll()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   879
            self._pool_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   880
        return result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   881
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   882
    def close(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   883
        """ Closing all subsessions. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   884
        _logger.debug("Closing session pool sub-sessions")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   885
        self._lock_pool = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   886
        self._pool_lock.acquire()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   887
        while len(self._used_sessions) > 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   888
            _logger.debug("Waiting to free used sessions.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   889
            _logger.debug("Waiting to free used sessions. %s %s" % (len(self._used_sessions), len(self._free_sessions)))            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   890
            _logger.debug(self._used_sessions)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   891
            _logger.debug(self._free_sessions)            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   892
            self._pool_lock.wait()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   893
        _logger.debug("Closing all free session from the pool.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   894
        while len(self._free_sessions) > 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   895
            self._free_sessions.pop().close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   896
        self._lock_pool = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   897
        self._pool_lock.notifyAll()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   898
        self._pool_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   899
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   900
    def _set_role_internal(self, role):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   901
        """ Set role on all subsessions. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   902
        self._lock_pool = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   903
        self._pool_lock.acquire()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   904
        while len(self._used_sessions)!=0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   905
            self._pool_lock.wait()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   906
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   907
        try:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   908
            for session in self._free_sessions:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   909
                session.role = session._set_role(role)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   910
        finally:                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   911
            self._lock_pool = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   912
            self._pool_lock.notifyAll()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   913
            self._pool_lock.release()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   914
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   915
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   916
class Query(object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   917
    """ This object wrap a synergy query, it takes a query as input as well as the
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   918
    attribute you want as output, and get them translated using the model configuration.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   919
    e.g 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   920
    Query(session, "type='task' and release='test/next'", ['objectname', 'task_synopsis'], ['ccmobject', 'string'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   921
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   922
    This will return a list of hash: [{'objectname': Task(xxx), 'task_synopsis': 'xxx'}, ...]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   923
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   924
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   925
    def __init__(self, session, query, keywords, model, cmd="query"):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   926
        """ Initialize a Synergy query."""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   927
        self._session = session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   928
        self._query = query
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   929
        self._keywords = keywords
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   930
        self._model = model
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   931
        self._cmd = cmd
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   932
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   933
    def execute(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   934
        """ Executing the query on the database. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   935
        mapper = DataMapperListResult(self._session, '@@@', self._keywords, self._model)        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   936
        query = "%s %s -u -f \"%s\"" % (self._cmd, self._query, mapper.format())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   937
        return self._session.execute(query, mapper)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   938
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   939
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   940
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   941
class InvalidFourPartNameException(CCMException):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   942
    """ Badly formed Synergy four-part name. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   943
    def __init__(self, fpn = ""):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   944
        CCMException.__init__(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   945
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   946
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   947
class FourPartName(object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   948
    """ This class handle four part name parsing and validation.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   949
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   950
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   951
    def __init__(self, ifpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   952
        """ Create a FourPartName object based on a ifpn string.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   953
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   954
        The string have to match the following patterns:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   955
        - name-version:type:instance
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   956
        - name:version:releasedef:instance
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   957
        - Task database#id
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   958
        - Folder database#id
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   959
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   960
        Anything else is considered as old release string format.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   961
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   962
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   963
        _logger.debug("FourPartName: '%s'", ifpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   964
        fpn = FourPartName.convert(ifpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   965
        result = re.search(r"^(?P<name>.+)-(?P<version>.+?):(?P<type>\S+):(?P<instance>\S+)$", fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   966
        if result == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   967
            result = re.search(r"^(?P<name>.+):(?P<version>.+?):(?P<type>releasedef):(?P<instance>\S+)$", fpn)            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   968
            if result == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   969
                raise InvalidFourPartNameException(fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   970
        # set all attributes
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   971
        self._name = result.groupdict()['name']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   972
        self._version = result.groupdict()['version']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   973
        self._type = result.groupdict()['type']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   974
        self._instance = result.groupdict()['instance']    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   975
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   976
    def __getname(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   977
        """ Returns the name of the object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   978
        return self._name
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   979
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   980
    def __getversion(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   981
        """ Returns the version of the object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   982
        return self._version
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   983
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   984
    def __gettype(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   985
        """ Returns the type of the object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   986
        return self._type
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   987
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   988
    def __getinstance(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   989
        """ Returns the instance of the object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   990
        return self._instance
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   991
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   992
    def __getobjectname(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   993
        """ Returns the objectname of the object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   994
        if (self.type == 'releasedef'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   995
            return "%s:%s:%s:%s" % (self.name, self.version, self.type, self.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   996
        return "%s-%s:%s:%s" % (self.name, self.version, self.type, self.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   997
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   998
    def __str__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   999
        """ Returns the string representation of the object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1000
        return self.objectname
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1001
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1002
    def __repr__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1003
        """ Returns the string representation of the python object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1004
        if (self.type == 'releasedef'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1005
            return "<%s:%s:%s:%s>" % (self.name, self.version, self.type, self.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1006
        return "<%s-%s:%s:%s>" % (self.name, self.version, self.type, self.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1007
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1008
    def is_same_family(self, ccmobject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1009
        """ Returns True if the ccmobject is part of the same family (=same name, type and instance) as self. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1010
        assert isinstance(ccmobject, FourPartName)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1011
        return (self.name == ccmobject.name and self.type == ccmobject.type and self.instance == ccmobject.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1012
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1013
    def __getfamily(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1014
        """get family"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1015
        return "%s:%s:%s" % (self.name, self.type, self.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1016
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1017
    def __eq__(self, ccmobject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1018
        """ Returns True if object four parts name are identical. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1019
        if ccmobject == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1020
            return False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1021
        assert isinstance(ccmobject, FourPartName)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1022
        return (self.name == ccmobject.name and self.version == ccmobject.version and self.type == ccmobject.type and self.instance == ccmobject.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1023
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1024
    def __ne__(self, ccmobject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1025
        """ Returns True if object four parts name are different. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1026
        if ccmobject == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1027
            return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1028
        assert isinstance(ccmobject, FourPartName)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1029
        return (self.name != ccmobject.name or self.version != ccmobject.version or self.type != ccmobject.type or self.instance != ccmobject.instance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1030
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1031
    @staticmethod
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1032
    def is_valid(fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1033
        """ Check if a given string represents a valid four part name.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1034
        """        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1035
        return (re.match(r"^(.+)-(.+?):(\S+):(\S+)|(.+):(.+?):releasedef:(\S+)$", fpn) != None)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1036
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1037
    @staticmethod
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1038
    def convert(fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1039
        """ Update a CCM output string to a valid four part name. This is due to the inconsistent
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1040
             output of CM/Synergy CLI.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1041
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1042
        fpn = fpn.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1043
        if FourPartName.is_valid(fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1044
            return fpn
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1045
        result = re.search(r"^(?P<type>Task|Folder)\s+(?P<instance>\w+)#(?P<id>\d+)$", fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1046
        if result != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1047
            matches = result.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1048
            if matches["type"] == "Task":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1049
                return "task%s-1:task:%s" % (matches["id"], matches["instance"])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1050
            elif matches["type"] == "Folder":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1051
                return "%s-1:folder:%s" % (matches['id'], matches['instance'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1052
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1053
            result = re.search(r"^(?P<project>\S+)/(?P<version>\S+)$", fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1054
            if result != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1055
                matches = result.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1056
                return "%s:%s:releasedef:1" % (matches['project'], matches['version'])        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1057
            else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1058
                # Check the name doesn't contains any of the following character: " :-"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1059
                result = re.search(r"^[^\s^:^-]+$", fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1060
                if result != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1061
                    return "none:%s:releasedef:1" % (fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1062
        raise InvalidFourPartNameException(fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1063
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1064
    name = property (__getname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1065
    version = property (__getversion)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1066
    type = property (__gettype)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1067
    instance = property (__getinstance)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1068
    objectname = property (__getobjectname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1069
    family = property(__getfamily)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1070
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1071
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1072
class CCMObject(FourPartName):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1073
    """ Base class for any Synergy object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1074
               
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1075
    def __init__(self, session, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1076
        """initialisation"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1077
        FourPartName.__init__(self, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1078
        self._session = session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1079
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1080
    def _getsession(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1081
        """get session"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1082
        return self._session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1083
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1084
    session = property(_getsession)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1085
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1086
    def exists(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1087
        """ Check if an the object exists in the database. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1088
        return (len(self._session.execute("query \"name='%s' and version='%s' and type='%s' and instance='%s'\" -u -f \"%%objectname\"" % (self.name, self.version, self.type, self.instance), ObjectListResult(self._session)).output) == 1)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1089
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1090
    def __setitem__(self, name, value):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1091
        project = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1092
        if self.type == 'project':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1093
            project = "-p"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1094
        if value.endswith("\\"):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1095
            value += "\\"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1096
        result = self._session.execute("attribute -modify \"%s\" -v \"%s\" %s \"%s\"" % (name, value, project, self))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1097
        if result.status != 0 and result.status != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1098
            raise CCMException("Error modifying '%s' attribute. Result: '%s'" % (name, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1099
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1100
    def __getitem__(self, name):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1101
        """ Provides access to Synergy object attributes through the dictionary
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1102
        item interface.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1103
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1104
        result = self._session.execute("query \"name='%s' and version='%s' and type='%s' and instance='%s'\" -u -f \"%%%s\"" % (self.name, self.version, self.type, self.instance, name), ResultWithError(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1105
        if result.status != 0 and result.status != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1106
            raise CCMException("Error retrieving '%s' attribute. Result: '%s'" % (name, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1107
        if len(result.error.strip()) > 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1108
            raise CCMException("Error retrieving '%s' attribute. Reason: '%s'" % (name, result.error), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1109
        if result.output.strip() == "<void>":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1110
            return None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1111
        return result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1112
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1113
    def create_attribute(self, name, type_, value=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1114
        """create attribute"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1115
        if name in self.keys():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1116
            raise CCMException("Attribute '%s' already exist." % (name))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1117
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1118
        proj_arg = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1119
        if value != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1120
            args += " -value \"%s\"" % value
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1121
        if self.type == "project":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1122
            proj_arg = "-p"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1123
        result = self._session.execute("attribute -create \"%s\" -type \"%s\" %s %s \"%s\"" % (name, type_, args, proj_arg, self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1124
        if result.status != 0 and result.status != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1125
            raise CCMException("Error creating '%s' attribute. Result: '%s'" % (name, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1126
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1127
    def keys(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1128
        """ The list of supported Synergy attributes. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1129
        result = self._session.execute("attribute -la \"%s\"" % self, AttributeNameListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1130
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1131
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1132
    def is_predecessor_of(self, obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1133
        """is predecessor of returns boolean"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1134
        result = self._session.execute("query \"is_predecessor_of('%s') and name='%s'and version='%s'and type='%s'and instance='%s'\" -u -f \"%%objectname\"" % (obj, self.name, self.version, self.type, self.instance), ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1135
        if len(result.output):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1136
            return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1137
        return False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1138
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1139
    def predecessors(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1140
        """predecessors"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1141
        result = self._session.execute("query \"is_predecessor_of('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1142
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1143
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1144
    def successors(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1145
        """successors"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1146
        result = self._session.execute("query \"is_successor_of('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1147
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1148
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1149
    def is_recursive_predecessor_of(self, obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1150
        """is_recursive_predecessor_of returns boolean"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1151
        result = self._session.execute("query \"has_predecessor('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1152
        for sesh in result.output:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1153
            if sesh == obj:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1154
                return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1155
        for sesh in result.output:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1156
            if sesh.is_recursive_predecessor_of(obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1157
                return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1158
        return False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1159
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1160
    def is_recursive_predecessor_of_fast(self, obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1161
        """ Fast implementation of the recursive is_predecessor_of method. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1162
        input_objects = [self]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1163
        while len(input_objects) > 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1164
            query = " or ".join(["has_predecessor('%s')" % x for x in input_objects])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1165
            result = self._session.execute("query \"query\" -u -f \"%%objectname\"" % query, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1166
            for sesh in result.output:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1167
                if sesh == obj:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1168
                    return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1169
        return False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1170
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1171
    def is_recursive_sucessor_of(self, obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1172
        """is_recursive_sucessor_of returns boolean"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1173
        result = self._session.execute("query \"has_successor('%s')\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1174
        for sesh in result.output:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1175
            if sesh == obj:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1176
                return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1177
        for sesh in result.output:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1178
            if sesh.is_recursive_sucessor_of(obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1179
                return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1180
        return False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1181
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1182
    def is_recursive_successor_of_fast(self, obj):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1183
        """ Fast implementation of the recursive is_successor_of method. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1184
        input_objects = [self]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1185
        while len(input_objects) > 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1186
            query = " or ".join(["has_successor('%s')" % x for x in input_objects])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1187
            result = self._session.execute("query \"query\" -u -f \"%%objectname\"" % query, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1188
            for sesh in result.output:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1189
                if sesh == obj:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1190
                    return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1191
        return False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1192
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1193
    def relate(self, ccm_object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1194
        """relate"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1195
        result = self._session.execute("relate -name successor -from \"%s\" -to \"%s\"" % self, ccm_object, Result(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1196
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1197
            raise CCMException("Error relating objects %s to %s\n%s" % (self, ccm_object, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1198
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1199
    def finduse(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1200
        """ Tries to find where an object is used. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1201
        result = self._session.execute("finduse \"%s\"" % self, FinduseResult(self))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1202
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1203
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1204
    def delete(self, recurse=False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1205
        """ Delete a synergy project. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1206
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1207
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1208
            args = args + " -recurse"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1209
        parg = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1210
        if self.type == "project":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1211
            parg = "-project"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1212
        result = self._session.execute("delete %s %s \"%s\"" % (args, parg, self))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1213
        if result.status != 0 and result.status != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1214
            raise CCMException("An error occurred while deleting object %s (error status: %s)\n%s" % (self, result.status, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1215
        return result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1216
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1217
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1218
class File(CCMObject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1219
    """ Wrapper for any Synergy file object """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1220
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1221
    def __init__(self, session, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1222
        CCMObject.__init__(self, session, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1223
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1224
    def content(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1225
        """content"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1226
        result = self._session.execute("cat \"%s\"" % self)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1227
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1228
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1229
    def to_file(self, path):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1230
        """content to file"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1231
        if os.path.exists(path):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1232
            _logger.error("Error file %s already exists" % path)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1233
        if not os.path.exists(os.path.dirname(path)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1234
            os.makedirs(os.path.dirname(path))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1235
        # Content to file        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1236
        result = self._session.execute("cat \"%s\" > \"%s\"" % (self, os.path.normpath(path)))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1237
        if result.status != 0 and result.status != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1238
            raise CCMException("Error retrieving content from object %s in %s (error status: %s)\n%s" % (self, path, result.status, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1239
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1240
    def merge(self, ccm_object, task):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1241
        """merge"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1242
        assert ccm_object != None, "object must be defined."
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1243
        assert task != None, "task must be defined."
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1244
        assert task.type == "task", "task parameter must be of 'task' type."
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1245
        result = self._session.execute("merge -task %s \"%s\" \"%s\"" % (task['displayname'], self, ccm_object))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1246
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1247
        validity = 0
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1248
        for line in result.output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1249
            if re.match(r"Merge Source completed successfully\.", line):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1250
                validity = 2
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1251
            elif re.match(r"Warning: Merge Source warning. \(overlaps during merge\)\.", line):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1252
                validity = 1
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1253
            else:                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1254
                result = re.match(r"Associated object\s+(?P<object>.+)\s+with task", line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1255
                if result != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1256
                    return (self._session.create(result.groupdict()['object']), validity)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1257
                    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1258
        raise CCMException("Error during merge operation.\n" + result.output, result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1259
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1260
    def checkin(self, state, comment=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1261
        """checkin"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1262
        if comment != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1263
            comment = "-c \"%s\"" % comment
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1264
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1265
            comment = "-nc"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1266
        result = self._session.execute("checkin -s \"%s\" %s \"%s\" " % (state, comment, self))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1267
        for line in result.output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1268
            _logger.debug(line)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1269
            _logger.debug(r"Checked\s+in\s+'.+'\s+to\s+'%s'" % state)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1270
            if re.match(r"Checked\s+in\s+'.+'\s+to\s+'%s'" % state, line) != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1271
                return
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1272
        raise CCMException("Error checking in object %s,\n%s" % (self, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1273
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1274
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1275
class Project(CCMObject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1276
    """ Wrapper class for Synergy project object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1277
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1278
    def __init__(self, session, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1279
        CCMObject.__init__(self, session, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1280
        self._release = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1281
        self._baseline = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1282
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1283
    def _gettasks(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1284
        """gettasks"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1285
        result = self._session.execute("rp -show tasks \"%s\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1286
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1287
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1288
    def add_task(self, task):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1289
        """ Add a task to the update properties. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1290
        result = self._session.execute("up -add -task %s \"%s\"" % (task['displayname'], self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1291
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1292
            raise CCMException("Error adding task %s to project '%s'\n%s" % (task, self, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1293
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1294
    def remove_task(self, task):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1295
        """ Remove a task to the update properties. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1296
        result = self._session.execute("up -remove -task %s \"%s\"" % (task['displayname'], self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1297
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1298
            raise CCMException("Error removing task %s from project '%s'\n%s" % (task, self, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1299
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1300
    def add_folder(self, folder):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1301
        """ Add a folder to the update properties. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1302
        result = self._session.execute("up -add -folder %s \"%s\"" % (folder['displayname'], self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1303
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1304
            raise CCMException("Error adding folder %s to project '%s'\n%s" % (folder, self, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1305
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1306
    def remove_folder(self, folder):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1307
        """ Remove a folder to the update properties. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1308
        result = self._session.execute("up -remove -folder %s \"%s\"" % (folder['displayname'], self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1309
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1310
            raise CCMException("Error removing folder %s to project '%s'\n%s" % (folder, self, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1311
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1312
    def _getfolders(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1313
        """ Wrapper method to return the folder list from the update properties - please use the folders attribute to access it. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1314
        result = self._session.execute("up -show folders \"%s\" -u -f \"%%objectname\"" % self, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1315
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1316
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1317
    def _getsubprojects(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1318
        """ Wrapper method to return the subprojects list - please use the subprojects attribute to access it. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1319
        result = self._session.execute("query -t project \"recursive_is_member_of('%s', none)\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1320
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1321
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1322
    def get_members(self, recursive=False, **kargs):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1323
        """get members"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1324
        query = "is_member_of('%s')" % self.objectname
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1325
        if recursive:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1326
            query = "recursive_is_member_of('%s', none)" % self.objectname
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1327
        for key in kargs.keys():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1328
            query += " and %s='%s'" % (key, kargs[key])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1329
        result = self._session.execute("query \"%s\" -u -f \"%%objectname\"" % query, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1330
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1331
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1332
    def _getrelease(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1333
        """ Get the release of the current object. Returns a Releasedef object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1334
        self._release = Releasedef(self._session, self['release'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1335
        return self._release
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1336
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1337
    def _setrelease(self, release):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1338
        """ Set the release of the current object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1339
        self['release'] = release['displayname']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1340
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1341
    def refresh(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1342
        """ Refresh project update properties. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1343
        result = self._session.execute("up -refresh \"%s\"" % self.objectname, UpdatePropertiesRefreshResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1344
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1345
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1346
    def _getbaseline(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1347
        """ Get the baseline of the current project. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1348
        if self._baseline == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1349
            result = self._session.execute("up -show baseline_project \"%s\" -f \"%%displayname\" -u" % self.objectname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1350
            if result.output.strip().endswith('does not have a baseline project.'):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1351
                return None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1352
            self._baseline = self._session.create(result.output)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1353
        _logger.debug('baseline: %s' % self._baseline)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1354
        return self._baseline
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1355
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1356
    def set_baseline(self, baseline, recurse=False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1357
        """ Set project baseline. raise a CCMException in case or error. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1358
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1359
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1360
            args += " -r"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1361
        self._baseline = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1362
        result = self._session.execute("up -mb \"%s\" %s \"%s\"" % (baseline, args, self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1363
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1364
            raise CCMException("Error setting basline of project '%s'\n%s" % (self.objectname, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1365
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1366
    def set_update_method(self, name, recurse = False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1367
        """ Set the update method for the project (and subproject if recurse is True). """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1368
        assert name != None, "name must not be None."
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1369
        assert len(name) > 0, "name must not be an empty string."
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1370
        args = "-ru %s" % name
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1371
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1372
            args += " -r"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1373
        result = self._session.execute("up %s \"%s\"" % (args, self))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1374
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1375
            raise CCMException("Error setting reconfigure properties to %s for project '%s'\nStatus: %s\n%s" % (name, self.objectname, result.status, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1376
   
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1377
    def apply_update_properties(self, baseline = True, tasks_and_folders = True, recurse=True):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1378
        """ Apply update properties to subprojects. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1379
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1380
        if not baseline:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1381
            args += "-no_baseline"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1382
        if not tasks_and_folders:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1383
            args += " -no_tasks_and_folders"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1384
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1385
            args += " -apply_to_subprojs"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1386
        result = self._session.execute("rp %s \"%s\"" % (args, self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1387
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1388
            raise CCMException("Error applying update properties to subprojects for '%s'\n%s" % (self.objectname, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1389
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1390
    def root_dir(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1391
        """ Return the directory attached to a project. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1392
        result = self._session.execute("query \"is_child_of('%s','%s')\" -u -f \"%%objectname\"" % (self.objectname, self.objectname), ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1393
        return result.output[0]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1394
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1395
    def snapshot(self, targetdir, recursive=False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1396
        """ Take a snapshot of the project. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1397
        assert targetdir != None, "targetdir must be defined."
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1398
        if recursive:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1399
            recursive = "-recurse"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1400
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1401
            recursive = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1402
        result = self._session.execute("wa_snapshot -path \"%s\"  %s \"%s\"" % (os.path.normpath(targetdir), recursive, self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1403
        for line in result.output.splitlines():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1404
            if re.match(r"^Creation of snapshot work area complete.|Copying to file system complete\.\s*$", line):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1405
                return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1406
        raise CCMException("Error creation snapshot of %s,\n%s" % (self.objectname, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1407
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1408
    def checkout(self, release, version=None, purpose=None, subprojects=True):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1409
        """ Create a checkout of this project. 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1410
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1411
        This will only checkout the project in Synergy. It does not create a work area.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1412
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1413
        :param release: The Synergy release tag to use.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1414
        :param version: The new version to use for the project. This is applied to all subprojects.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1415
        :param purpose: The purpose of the checkout. Determines automatically the role from the purpose
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1416
         and switch it automatically (Could be any role from the DB).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1417
        """    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1418
        assert release != None, "Release object must be defined."
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1419
        if not release.exists():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1420
            raise CCMException("Release '%s' must exist in the database." % release)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1421
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1422
        args = ''
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1423
        if version != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1424
            args += '-to "%s"' % version
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1425
        role = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1426
        if purpose:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1427
            #save current role before changing
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1428
            role = self._session.role
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1429
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1430
            self._session.role = get_role_for_purpose(self._session, purpose)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1431
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1432
            args += " -purpose \"%s\"" % purpose
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1433
        if subprojects:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1434
            args += " -subprojects"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1435
        result = self._session.execute("checkout -project \"%s\" -release \"%s\" -no_wa %s" \
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1436
                                  % (self, release['displayname'], args), ProjectCheckoutResult(self._session, self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1437
        if not role is  None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1438
            self._session.role = role
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1439
        if result.project == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1440
            raise CCMException("Error checking out project %s,\n%s" % (self.objectname, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1441
        return result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1442
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1443
    def work_area(self, maintain, recursive=None, relative=None, path=None, pst=None, wat=False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1444
        """ Configure the work area. This allow to enable it or disable it, set the path, recursion... """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1445
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1446
        if maintain:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1447
            args += "-wa"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1448
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1449
            args += "-nwa"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1450
        # path
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1451
        if path != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1452
            args += " -path \"%s\"" % path        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1453
        # pst
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1454
        if pst != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1455
            args += " -pst \"%s\"" % pst
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1456
        # relative
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1457
        if relative != None and relative:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1458
            args += " -relative"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1459
        elif relative != None and not relative:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1460
            args += " -not_relative"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1461
        # recursive
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1462
        if recursive != None and recursive:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1463
            args += " -recurse"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1464
        elif recursive != None and not recursive:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1465
            args += " -no_recurse"        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1466
        #wat            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1467
        if wat:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1468
            args += " -wat"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1469
        result = self._session.execute("work_area -project \"%s\" %s" \
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1470
                                  % (self.objectname, args), Result(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1471
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1472
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1473
    def update(self, recurse=True, replaceprojects=True, keepgoing=False, result=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1474
        """ Update the project based on its reconfigure properties. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1475
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1476
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1477
            args += " -r "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1478
        if replaceprojects:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1479
            args += " -rs "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1480
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1481
            args += " -ks "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1482
        if result == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1483
            result = UpdateResult(self._session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1484
        result = self._session.execute("update %s -project %s" % (args, self.objectname), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1485
        if not result.successful and not keepgoing:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1486
            raise CCMException("Error updating %s" % (self.objectname), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1487
        return result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1488
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1489
    def reconcile(self, updatewa=True, recurse=True, consideruncontrolled=True, missingwafile=True, report=True):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1490
        """ Reconcile the project to force the work area to match the database. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1491
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1492
        if updatewa:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1493
            args += " -update_wa "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1494
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1495
            args += " -recurse "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1496
        if consideruncontrolled:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1497
            args += " -consider_uncontrolled "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1498
        if missingwafile:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1499
            args += " -missing_wa_file "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1500
        if report:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1501
            args += " -report reconcile.txt "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1502
        result = self._session.execute("reconcile %s -project %s" % (args, self.objectname), Result(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1503
        if re.search(r"There are no conflicts in the Work Area", result.output) == None and re.search(r"Reconcile completed", result.output) == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1504
            raise CCMException("Error reconciling %s,\n%s" % (self.objectname, result.output), result)        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1505
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1506
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1507
    def get_latest_baseline(self, filterstring="*", state="released"):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1508
        """get_latest_baseline"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1509
        result = self._session.execute("query -n %s -t project -f \"%%displayname\" -s %s -u -ns \"version smatch'%s'\"" % (self.name, state, filterstring))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1510
        lines = result.output.splitlines()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1511
        return lines[-1]
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1512
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1513
    def create_baseline(self, baseline_name, release, baseline_tag, purpose="System Testing", state="published_baseline"):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1514
        """create_baseline"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1515
        result = self._session.execute("baseline -create %s -release %s -purpose \"%s\" -vt %s -project \"%s\" -state \"%s\"" % (baseline_name, release, purpose, baseline_tag, self.objectname, state))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1516
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1517
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1518
    def sync(self, recurse=False, static=False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1519
        """ Synchronize project content. By default it is not been done recusively. (Not unittested)"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1520
        args = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1521
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1522
            args += " -recurse"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1523
        if static:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1524
            args += " -static"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1525
        result = self._session.execute("sync %s -project \"%s\"" % (args, self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1526
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1527
            raise CCMException("Error during synchronization of %s: %s." % (self.objectname, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1528
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1529
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1530
    def conflicts(self, recurse=False, tasks=False):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1531
        """conflicts"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1532
        args = "-noformat "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1533
        if recurse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1534
            args += " -r"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1535
        if tasks:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1536
            args += " -t"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1537
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1538
        result = self._session.execute("conflicts %s  \"%s\"" % (args, self.objectname), ConflictsResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1539
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1540
            raise CCMException("Error during conflict detection of %s: %s." % (self.objectname, result))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1541
        return result
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1542
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1543
    tasks = property(_gettasks)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1544
    folders = property(_getfolders)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1545
    subprojects = property(_getsubprojects)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1546
    release = property(_getrelease, _setrelease)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1547
    baseline = property(_getbaseline, set_baseline)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1548
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1549
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1550
class Dir(CCMObject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1551
    """ Wrapper class for Synergy dir object """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1552
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1553
    def __init__(self, session, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1554
        CCMObject.__init__(self, session, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1555
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1556
    def children(self, project):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1557
        """children"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1558
        assert(project.type == 'project')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1559
        result = self._session.execute("query \"is_child_of('%s','%s')\" -u -f \"%%objectname\"" % (self.objectname, project), ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1560
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1561
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1562
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1563
class Releasedef(CCMObject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1564
    """ Wrapper class for Synergy releasedef object """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1565
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1566
    def __init__(self, session, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1567
        CCMObject.__init__(self, session, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1568
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1569
    def _getcomponent(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1570
        """get component"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1571
        return self.name
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1572
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1573
    component = property(_getcomponent)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1574
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1575
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1576
class Folder(CCMObject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1577
    """ Wrapper class for Synergy folder object """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1578
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1579
    def __init__(self, session, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1580
        CCMObject.__init__(self, session, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1581
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1582
    def _gettasks(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1583
        """ Accessor for 'tasks' property. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1584
        result = self._session.execute("folder -show tasks \"%s\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1585
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1586
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1587
    def _getobjects(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1588
        """get objects"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1589
        result = self._session.execute("folder -show objects \"%s\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1590
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1591
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1592
    def _getmode(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1593
        """ Get the mode used by the folder. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1594
        result = self._session.execute("folder -show mode \"%s\"" % self.objectname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1595
        return result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1596
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1597
    def _getquery(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1598
        """ Get the query that populate the folder. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1599
        if self.mode.lower() == "query":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1600
            result = self._session.execute("folder -show query \"%s\"" % self.objectname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1601
            return result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1602
        else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1603
            raise CCMException("%s is not a query base folder." % (self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1604
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1605
    def _getdescription(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1606
        """ Get the description associated with the folder. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1607
        result = self._session.execute("query -t folder -n %s -i %s -u -f \"%%description\"" % (self.name, self.instance))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1608
        return result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1609
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1610
    def remove(self, task):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1611
        """ Remove task from this folder. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1612
        result = self._session.execute("folder -m \"%s\" -remove_task \"%s\"" % (self.objectname, task.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1613
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1614
            raise CCMException("Error removing task %s from %s: %s." % (task.objectname, self.objectname, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1615
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1616
    def update(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1617
        """update"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1618
        result = self._session.execute("folder -m -update -f \"%%objectname\"" % self.objectname)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1619
        if result.status != None and result.status != 0:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1620
            raise CCMException("Error updating the folder content %s: %s." % (self.objectname, result.output))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1621
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1622
    def append(self, task):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1623
        """ Associate an object to a task """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1624
        class AddTaskException(CCMException):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1625
            """add task exception"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1626
            def __init__(self, reason, task, result):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1627
                CCMException.__init__(self, reason, result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1628
                self.task = task
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1629
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1630
        result = self._session.execute("folder -m -at \"%s\" \"%s\"" % (task.objectname, self.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1631
        if re.search(r"(Added 1 task to)|(is already in folder)", result.output, re.M) is None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1632
            raise AddTaskException(result.output, result, task)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1633
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1634
    def copy(self, existing_folder):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1635
        """ Copy the contents of existing_folder into this folder.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1636
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1637
        This appends to the destination folder by default.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1638
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1639
        :param existing_folder: The destination Folder object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1640
        """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1641
        result = self._session.execute("folder -copy %s -existing %s -append" % (self.objectname, existing_folder), FolderCopyResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1642
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1643
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1644
    objects = property(_getobjects)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1645
    tasks = property(_gettasks)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1646
    mode = property(_getmode)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1647
    query = property(_getquery)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1648
    is_query_based = property(lambda x: x.mode.lower() == "query")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1649
    description = property(_getdescription)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1650
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1651
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1652
class Task(CCMObject):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1653
    """ Wrapper class for Synergy task object """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1654
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1655
    def __init__(self, session, fpn):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1656
        CCMObject.__init__(self, session, fpn)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1657
        self.__unicode_str_text = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1658
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1659
    def _getobjects(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1660
        """get objects"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1661
        result = self._session.execute("task -show objects \"%s\" -u -f \"%%objectname\"" % self.objectname, ObjectListResult(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1662
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1663
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1664
    def append(self, ccm_object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1665
        """ Associate an object to a task """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1666
        class AddObjectException(CCMException):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1667
            """add object exception"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1668
            def __init__(self, comment, ccm_object):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1669
                CCMException.__init__(self, comment)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1670
                self.ccm_object = ccm_object
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1671
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1672
        result = self._session.execute("task -associate \"%s\" -object \"%s\"" % (self.objectname, ccm_object.objectname))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1673
        if not re.match(r"Associated object .+ with task .*\.", result.output, re.M):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1674
            raise AddObjectException(result.output)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1675
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1676
    def assign(self, username):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1677
        """assign"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1678
        result = self._session.execute("task -modify \"%s\" -resolver %s" % (self.objectname, username))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1679
        if not re.match(r"Changed resolver of task", result.output, re.M):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1680
            raise CCMException("Error assigning task to user '%s',\n%s" % (username, result.output), result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1681
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1682
    def _getsynopsis(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1683
        """get synopsis"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1684
        return self['task_synopsis']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1685
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1686
    @staticmethod
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1687
    def create(session, release_tag, synopsis=""):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1688
        """create"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1689
        assert release_tag.type == "releasedef", "release_tag must be a CCM object wrapper of releasedef type"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1690
        result = session.execute("task -create -synopsis \"%s\" -release \"%s\"" % (synopsis, release_tag['displayname']), CreateNewTaskResult(session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1691
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1692
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1693
    objects = property(_getobjects)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1694
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1695
    def __unicode__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1696
        # TODO: use optimised query that makes only 1 ccm query with suitable format
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1697
        if self.__unicode_str_text == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1698
            self.__unicode_str_text = u'%s: %s' % (self['displayname'], self['task_synopsis'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1699
        return self.__unicode_str_text
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1700
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1701
    def __str__(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1702
        return self.__unicode__().encode('ascii', 'replace')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1703
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1704
    def get_release_tag(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1705
        """ Get task release. Use release property!"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1706
        result = self._session.execute("attribute -show release \"%s\"" % (self.objectname), Result(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1707
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1708
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1709
    def set_release_tag(self, release_tag):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1710
        """ Set task release. Use release property!"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1711
        result = self._session.execute("attribute -modify release -value \"%s\" \"%s\"" % (release_tag, self.objectname), Result(self._session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1712
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1713
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1714
    release = property(get_release_tag, set_release_tag)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1715
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1716
class UpdateTemplate:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1717
    """ Allow to access Update Template property using Release and Purpose. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1718
    def __init__(self, releasedef, purpose):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1719
        assert(releasedef != None)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1720
        assert(purpose != None)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1721
        self._releasedef = releasedef
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1722
        self._purpose = purpose
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1723
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1724
    def objectname(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1725
        """ Return the objectname representing this virtual object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1726
        return "%s:%s" % (self._releasedef['displayname'], self._purpose)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1727
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1728
    def baseline_projects(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1729
        """ Query all projects for this UpdateTemplate. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1730
        result = self._releasedef.session.execute("ut -sh baseline_projects \"%s\"" % self.objectname(), ObjectListResult(self._releasedef.session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1731
        print result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1732
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1733
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1734
    def information(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1735
        """ Query all projects for this UpdateTemplate. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1736
        result = self._releasedef.session.execute("ut -sh information \"%s\"" % self.objectname(), UpdateTemplateInformation(self._releasedef.session))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1737
        print result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1738
        return result.output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1739
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1740
    def baseline_selection_mode(self):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1741
        """ The current Baseline selection mode """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1742
        result = self._releasedef.session.execute("ut -sh bsm \"%s\"" % self.objectname())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1743
        print result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1744
        return result.output.strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1745
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1746
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1747
def read_ccmwaid_info(filename):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1748
    """ Read data from a ccmwaid file. This method is an helper to retreive a project from a physical location. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1749
    ccmwaid = open(filename, 'r')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1750
    # first line: database
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1751
    dbpath = os.path.dirname(ccmwaid.readline().strip())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1752
    database = os.path.basename(dbpath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1753
    # 2nd line should be a timestamp
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1754
    ccmwaid.readline().strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1755
    # 3rd line is the objectname
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1756
    objectref = ccmwaid.readline().strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1757
    ccmwaid.close()    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1758
    return {'dbpath': dbpath, 'database': database, 'objectname': objectref}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1759
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1760
def create_project_from_path(session, path):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1761
    """ Uses the (_|.)ccmwaid.inf file to create a Project object. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1762
    ccmwaid = ".ccmwaid.inf"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1763
    if os.name == 'nt':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1764
        ccmwaid = "_ccmwaid.inf"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1765
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1766
    if (not os.path.exists(path + "/" + ccmwaid)):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1767
        return None    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1768
    result = read_ccmwaid_info(path + "/" + ccmwaid)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1769
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1770
    return session.create(result['objectname'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1771
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1772
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1773
def open_session(username=None, password=None, engine=None, dbpath=None, database=None, reuse=True):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1774
    """Provides a Session object.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1775
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1776
    Attempts to return a Session, based either on existing Synergy
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1777
    sessions or by creating a new one.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1778
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1779
    - If a .netrc file can be found on the user's personal drive,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1780
      that will be read to obtain Synergy login information if it 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1781
      is defined there. This will be used to fill in any missing 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1782
      parameters not passed in the call to open_session().
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1783
      
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1784
      The format of the .netrc file entries should be:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1785
      
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1786
      machine synergy login USERNAME password foobar account DATABASE_PATH@SERVER
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1787
      
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1788
      If the details refer to a specific database, the machine can be the database name,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1789
      instead of "synergy".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1790
    - If an existing session is running that matches the supplied
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1791
      parameters, it will reuse that.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1792
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1793
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1794
    # See if a .netrc file can be used
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1795
    if CCM_BIN == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1796
        raise CCMException("Could not find CM/Synergy executable in the path.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1797
    if password == None or username == None or engine == None or dbpath == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1798
        if os.sep == '\\':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1799
            os.environ['HOME'] = "H:" + os.sep
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1800
        _logger.debug('Opening .netrc file')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1801
        try:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1802
            netrc_file = netrc.netrc()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1803
            netrc_info = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1804
            # If settings for a specific database 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1805
            if database != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1806
                netrc_info = netrc_file.authenticators(database)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1807
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1808
            # if not found just try generic one
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1809
            if netrc_info == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1810
                netrc_info = netrc_file.authenticators('synergy')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1811
                
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1812
            if netrc_info != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1813
                (n_username, n_account, n_password) = netrc_info
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1814
                if username == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1815
                    username = n_username
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1816
                if password == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1817
                    password = n_password
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1818
                if n_account != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1819
                    (n_dbpath, n_engine) = n_account.split('@')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1820
                    if dbpath == None and n_dbpath is not None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1821
                        _logger.info('Database path set using .netrc (%s)' % n_dbpath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1822
                        dbpath = n_dbpath
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1823
                    if engine == None and n_engine is not None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1824
                        _logger.info('Database engine set using .netrc (%s)' % n_engine)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1825
                        engine = n_engine
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1826
        except IOError:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1827
            _logger.debug('Error accessing .netrc file')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1828
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1829
    # last chance...
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1830
    if username == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1831
        username = os.environ['USERNAME']
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1832
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1833
    # looking for dbpath using GSCM database
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1834
    if dbpath == None and database != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1835
        _logger.info('Database path set using the GSCM database.')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1836
        dbpath = nokia.gscm.get_db_path(database)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1837
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1838
    # looking for engine host using GSCM database
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1839
    if engine == None and database != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1840
        _logger.info('Database engine set using the GSCM database.')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1841
        engine = nokia.gscm.get_engine_host(database)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1842
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1843
    _sessions = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1844
    # See if any currently running sessions can be used, only if no password submitted, else use a brand new session!
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1845
    if password == None and reuse:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1846
        _logger.debug('Querying for existing Synergy sessions')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1847
        command = "%s status" % (CCM_BIN)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1848
        pipe = os.popen(command, 'r')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1849
        result = pipe.read()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1850
        pipe.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1851
        _logger.debug('ccm status result: ' + result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1852
        for match in re.finditer(r'(?P<ccmaddr>\w+:\d+:\d+.\d+.\d+.\d+(:\d+.\d+.\d+.\d+)?)(?P<current_session>\s+\(current\s+session\))?\nDatabase:\s*(?P<dbpath>\S+)', result, re.M):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1853
            dictionary = match.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1854
            _logger.debug(dictionary['ccmaddr'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1855
            _logger.debug(socket.gethostname())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1856
            _logger.debug(dictionary['current_session'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1857
            if dictionary['ccmaddr'].lower().startswith(socket.gethostname().lower()):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1858
                # These session objects should not close the session on deletion,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1859
                # because they did not initially create the session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1860
                existing_session = Session(username, engine, dictionary['dbpath'], dictionary['ccmaddr'], close_on_exit=False)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1861
                _logger.debug('Existing session found: %s' % existing_session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1862
                _sessions.append(existing_session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1863
        # looking for session using dbpath
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1864
        for session in _sessions:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1865
            if session.dbpath == dbpath:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1866
                return session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1867
    else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1868
        # looking for router address using GSCM database
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1869
        router_address = None
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1870
        if database == None and dbpath != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1871
            database = os.path.basename(dbpath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1872
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1873
        lock = fileutils.Lock(CCM_SESSION_LOCK)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1874
        try:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1875
            lock.lock(wait=True)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1876
            # if we have the database name we can switch to the correct Synergy router
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1877
            if database != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1878
                _logger.info('Getting router address.')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1879
                router_address = nokia.gscm.get_router_address(database)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1880
                if os.sep == '\\' and router_address != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1881
                    routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), 'r')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1882
                    current_router = routerfile.read().strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1883
                    routerfile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1884
                    if current_router != router_address.strip():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1885
                        _logger.info('Updating %s' % (os.path.normpath(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"))))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1886
                        routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), "w+")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1887
                        routerfile.write("%s\n" % router_address)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1888
                        routerfile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1889
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1890
            # If no existing sessions were available, start a new one
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1891
            _logger.info('Opening session.')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1892
            new_session = Session.start(username, password, engine, dbpath)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1893
            lock.unlock()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1894
            return new_session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1895
        finally:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1896
            lock.unlock()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1897
    raise CCMException("Cannot open session for user '%s'" % username)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1898
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1899
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1900
def get_role_for_purpose(session, purpose):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1901
    """  return role needed to modify project with checkout for purpose. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1902
    purposes = session.purposes()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1903
    if purpose in purposes:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1904
        if purposes[purpose]['status'] == 'prep':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1905
            return 'build_mgr'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1906
    else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1907
        raise CCMException("Could not find purpose '%s' in the database.\n Valid purpose are: %s." % (purpose, ','.join(purposes.keys())))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1908
    return 'developer'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1909
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1910
def get_role_for_status(status):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1911
    """  return role needed to modify project with a specific status. """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1912
    if status == 'prep':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1913
        return 'build_mgr'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1914
    elif status == 'shared':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1915
        return 'developer'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1916
    elif status == 'working':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1917
        return 'developer'
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1918
    else:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1919
        raise CCMException("Unknow status '%s'" % status)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1920
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1921
def running_sessions(database=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1922
    """ Return the list of synergy session currently available on the local machine.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1923
        If database is given then it tries to update the router address.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1924
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1925
    _logger.debug('Querying for existing Synergy sessions')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1926
    if CCM_BIN == None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1927
        raise CCMException("Could not find CM/Synergy executable in the path.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1928
    command = "%s status" % (CCM_BIN)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1929
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1930
    lock = fileutils.Lock(CCM_SESSION_LOCK)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1931
    result = ""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1932
    output = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1933
    try:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1934
        # if we have the database name we can switch to the correct Synergy router
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1935
        if database != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1936
            lock.lock(wait=True)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1937
            _logger.info('Updating router address.')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1938
            router_address = nokia.gscm.get_router_address(database)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1939
            if os.sep == '\\' and router_address != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1940
                routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), 'r')
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1941
                current_router = routerfile.read().strip()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1942
                routerfile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1943
                if current_router != router_address.strip():
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1944
                    _logger.info('Updating %s' % (os.path.normpath(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"))))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1945
                    routerfile = open(os.path.join(os.path.dirname(CCM_BIN), "../etc/_router.adr"), "w+")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1946
                    routerfile.write("%s\n" % router_address)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1947
                    routerfile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1948
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1949
        _logger.debug('Command: ' + command)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1950
        (result, status) = _execute(command)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1951
        if database != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1952
            lock.unlock()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1953
        if (status != 0):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1954
            raise CCMException("Ccm status execution returned an error.")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1955
        _logger.debug('ccm status result: ' + result)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1956
        for match in re.finditer(r'Command Interface\s+@\s+(?P<ccmaddr>\w+:\d+:\d+.\d+.\d+.\d+(:\d+.\d+.\d+.\d+)*)(?P<current_session>\s+\(current\s+session\))?\s+Database:\s*(?P<dbpath>\S+)', result, re.M):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1957
            data = match.groupdict()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1958
            _logger.debug(data['ccmaddr'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1959
            _logger.debug(socket.gethostname())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1960
            _logger.debug(data['current_session'])
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1961
            if data['ccmaddr'].lower().startswith(socket.gethostname().lower()):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1962
                # These session objects should not close the session on deletion,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1963
                # because they did not initially create the session
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1964
                existing_session = Session(None, None, data['dbpath'], data['ccmaddr'], close_on_exit=False)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1965
                _logger.debug('Existing session found: %s' % existing_session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1966
                output.append(existing_session)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1967
    finally:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1968
        if database != None:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1969
            lock.unlock()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1970
    return  output
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1971
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1972
def session_exists(sessionid, database=None):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1973
    """determine if session exists"""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1974
    for session in running_sessions(database=database):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1975
        _logger.debug(session.addr() + "==" + sessionid + "?")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1976
        if session.addr() == sessionid:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1977
            return True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1978
    return False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1979
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1980
# The location of the ccm binary must be located to know where the _router.adr file is, to support
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1981
# switching databases.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1982
CCM_BIN = fileutils.which("ccm")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1983
if os.sep == '\\':
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
  1984
    CCM_BIN = fileutils.which("ccm.exe")