[csw-devel] SF.net SVN: gar:[13361] csw/mgar/gar/v2

wahwah at users.sourceforge.net wahwah at users.sourceforge.net
Fri Feb 18 16:14:18 CET 2011


Revision: 13361
          http://gar.svn.sourceforge.net/gar/?rev=13361&view=rev
Author:   wahwah
Date:     2011-02-18 15:14:18 +0000 (Fri, 18 Feb 2011)

Log Message:
-----------
uwatch: Moving the code to lib/python

Modified Paths:
--------------
    csw/mgar/gar/v2/bin/uwatch

Added Paths:
-----------
    csw/mgar/gar/v2/lib/python/uwatch.py

Property Changed:
----------------
    csw/mgar/gar/v2/bin/uwatch

Modified: csw/mgar/gar/v2/bin/uwatch
===================================================================
--- csw/mgar/gar/v2/bin/uwatch	2011-02-18 15:13:30 UTC (rev 13360)
+++ csw/mgar/gar/v2/bin/uwatch	2011-02-18 15:14:18 UTC (rev 13361)
@@ -1,1675 +1 @@
-#!/opt/csw/bin/python2.6
-
-# TODO : check arguments for valid date
-# TODO : check arguments for emtpy strings
-
-#
-# The contents of this file are subject to the COMMON DEVELOPMENT AND
-# DISTRIBUTION LICENSE (CDDL) (the "License"); you may not use this
-# file except in compliance with the License.
-#
-# Software distributed under the License is distributed on an "AS IS" basis,
-# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
-# for the specific language governing rights and limitations under the
-# License.
-#
-# Alternatively, the contents of this file may be used under the terms of
-# either the GNU General Public License Version 3 or later (the "GPL"),
-# in which case the provisions of the GPL are applicable instead
-# of those above. If you wish to allow use of your version of this file only
-# under the terms of either the GPL, and not to allow others to
-# use your version of this file under the terms of the CDDL, indicate your
-# decision by deleting the provisions above and replace them with the notice
-# and other provisions required by the GPL. If you do not delete
-# the provisions above, a recipient may use your version of this file under
-# the terms of any one of the CDDL, or the GPL.
-#
-# Copyright 2010 OpenCSW (http://www.opencsw.org).  All rights reserved.
-# Use is subject to license terms.
-#
-#
-# Contributors list :
-#
-#    William Bonnet wbonnet at opencsw.org
-#
-#
-
-# Import all the needed modules
-import sys
-import string
-import re
-import os
-import shutil
-import subprocess
-import pysvn
-import MySQLdb
-import datetime
-import ConfigParser
-
-from urllib2 import Request, urlopen, URLError
-from optparse import OptionParser
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class InvalidSourceDirectoryContentException(Exception):
-    """Exception raised when a method is called on the Abstract command class
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, message):
-        self.message = message
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class AbstractCommandMethodCallException(Exception):
-    """Exception raised when a method is called on the Abstract command class
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, message):
-        self.message = message
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class SvnClientException(Exception):
-    """Exception raised when an error occur while using svnClient
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, message):
-        self.message = message
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class DatabaseConnectionException(Exception):
-    """Exception raised when an error occur while connecting to the database
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, message):
-        self.message = message
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class DuplicatePackageException(Exception):
-    """Exception raised when an error occur while connecting to the database
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, message):
-        self.message = message
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class UpstreamUrlRetrievalFailedException(Exception):
-    """Exception raised when an unsuported protocol is specified in the upstream url
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, url):
-        self.url  = url
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class NoUpstreamVersionFoundException(Exception):
-    """Exception raised when searching the upstream page content does not match the regexp
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, url, regexp):
-        self.url     = url
-        self.regexp  = regexp
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class MissingArgumentException(Exception):
-    """Exception raised when a command line argument is missing
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, value):
-        self.parameter = value
-
-    def __str__(self):
-        return repr(self.parameter)
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class InvalidArgumentException(Exception):
-    """Exception raised when a command line argument is invalid. For instance an invalid version or date
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, value):
-        self.parameter = value
-
-    def __str__(self):
-        return repr(self.parameter)
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class CommandLineParser(object):
-    """This class is used to parse command line. It process only options. Command verb is parsed by the main procedure
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self):
-        # Create the parser object
-        self.optionParser = OptionParser()
-
-        # Add options to parser
-        self.optionParser.add_option("--verbose",     help="Activate verbose mode", action="store_true", dest="verbose")
-        self.optionParser.add_option("--current-version",    help="Current package version", action="store", dest="current_version")
-        self.optionParser.add_option("--target-location",    help="Target location. This is the directory in which the branch will be created (parent of the branch directory). Default value is ../branches", action="store", dest="target_location")
-        self.optionParser.add_option("--regexp",            help="Version matching regular expression", action="store", dest="regexp")
-        self.optionParser.add_option("--source-directory",  help="Source directory (place from where the build is copied). Default value is current directory", action="store", dest="source_directory")
-        self.optionParser.add_option("--target-version",    help="Package target version", action="store", dest="target_version")
-        self.optionParser.add_option("--upstream-url",      help="Upstream version page url", action="store", dest="upstream_url")
-
-        # Option used for reporting uwatch result
-        self.optionParser.add_option("--uwatch-error",      help="Flag used to report a uwatch error", action="store_true", dest="uwatch_error")
-        self.optionParser.add_option("--uwatch-output",     help="Flag used to report the uwatch output", action="store", dest="uwatch_output")
-        self.optionParser.add_option("--uwatch-deactivated",help="Flag used to report a uwatch error", action="store_true", dest="uwatch_deactivated")
-        self.optionParser.add_option("--uwatch-pkg-root",   help="Defines the uwatch package root working directory", action="store", dest="uwatch_pkg_root")
-
-        # Option used for storing version information in the database
-        self.optionParser.add_option("--gar-distfiles",     help="Gar version of the package", action="store", dest="gar_distfiles")
-        self.optionParser.add_option("--gar-version",       help="Gar version of the package", action="store", dest="gar_version")
-        self.optionParser.add_option("--upstream-version",  help="Upstream version of the package", action="store", dest="upstream_version")
-        self.optionParser.add_option("--gar-path",          help="Relative path in svn repository", action="store", dest="gar_path")
-        self.optionParser.add_option("--catalog-name",      help="Catalog name", action="store", dest="catalog_name")
-        self.optionParser.add_option("--package-name",      help="Package name", action="store", dest="package_name")
-        self.optionParser.add_option("--execution-date",    help="Check date to be stored in the database", action="store", dest="execution_date")
-
-        self.optionParser.add_option("--database-schema",   help="Defines the database to use in the connection string", action="store", dest="database_schema")
-        self.optionParser.add_option("--database-host",     help="Defines the database host to use in the connection string", action="store", dest="database_host")
-        self.optionParser.add_option("--database-user",     help="Defines the database user to use in the connection string", action="store", dest="database_user")
-        self.optionParser.add_option("--database-password", help="Defines the database password to use in the connection string", action="store", dest="database_password")
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def parse(self):
-        (self.options, self.args) = self.optionParser.parse_args()
-        return self.options, self.args
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class UwatchConfiguration(object):
-    """This handles parameters retrieved either from command line or configuration file.
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def initialize(self, args):
-        """Initialize configuration object. If configurations contains files reference, values from the files are
-        read and copied into this object. Next attempts to retrieve files stored information will read values from
-        this object.
-        """
-
-        # Default is no file parser
-        fileParser = None
-
-        # Test if the .uwatchrc file exists
-        if os.path.isfile( os.path.expanduser("~/.uwatchrc") ):
-            # Yes thus load values from the configuration file before processing args parameter
-            # This allow to override from the command line some values stored in the config file
-            fileParser = ConfigParser.ConfigParser()
-            fileParser.read( [os.path.expanduser("~/.uwatchrc") ] )
-
-            # Read the database schema from the config file            
-            try:
-                self._database_schema = fileParser.get("main", "database-schema")
-            except Config.NoOptionError:
-                self._database_schema = None
-
-            # Read the database hostname from the config file            
-            try:
-                self._database_host = fileParser.get("main", "database-host")
-            except Config.NoOptionError:
-                self._database_host = None
-
-            # Read the database user from the config file            
-            try:
-                self._database_user = fileParser.get("main", "database-user")
-            except Config.NoOptionError:
-                self._database_user = None
-
-            # Read the database password from the config file            
-            try:
-                self._database_password = fileParser.get("main", "database-password")
-            except Config.NoOptionError:
-                self._database_password = None
-
-            # Read the package root working dir from the config file            
-            try:
-                self._uwatch_pkg_root = fileParser.get("main", "uwatch-pkg-root")
-            except Config.NoOptionError:
-                self._uwatch_pkg_root = None
-
-        # This member variable is a flag which defines the status of the verbose mode (True : activated)
-        if args.verbose != None:
-            self._verbose = args.verbose
-        else:
-            self._verbose = False
-
-        # This member variable defines the value of the version of the package
-        # Current revision is not passed as a separated argument. It is part of the opencsw version number. 
-        # Package version are defined as follow : version[,REV=revision]*
-        if args.current_version != None:
-    
-            # Parse the version string
-            ver = re.split(r"(?P<version>.*),REV=(?P<revision>.*)", args.current_version)
-
-            # Test if this is a match
-            if ver == None:
-                # No, thus raise an exception
-                msg = "Unable to parse %(version)s as a valid package version" % { 'version' : args.current_version }
-                raise InvalidArgumentException(msg)
-            else:      
-                # If the length of array is one, the no revision is provided
-                if len(ver) == 1:
-                    self._current_version = ver[0]
-                    self._current_revision = ""
-                else:
-                    self._current_version = ver[1]
-                    self._current_revision = ver[2]
-
-                    # Attempt to split again the string. If len is greater than 1
-                    # Then there are at least two rev string => raise exception
-                    ver = re.split(r"(?P<version>.*),REV=(?P<revision>.*)", self._current_version)
-                    if len(ver) > 1:
-                        msg = "Unable to parse %(version)s as a valid package version. There are more than one revision string" % { 'version' : args.current_version }
-                        raise InvalidArgumentException(msg)
-
-        # This member variable defines the value of the regexp used to match the upstream web page
-        if args.regexp != None:
-            self._regexp = args.regexp
-
-        # This member variable defines the url of the upstream web page used to check for new version
-        if args.upstream_url != None:
-            self._upstream_url = args.upstream_url
-
-        # This member variable defines the target version of the package during upgrade
-        if args.target_version != None:
-            self._target_version = args.target_version
-
-        # This member variable defines the target directory of the package during upgrade. This is the location of the new branch
-        if args.target_location != None:
-            self._target_location = args.target_location
-
-        # This member variable defines the source directory of the package during upgrade. This is the location of the trunk (most of the time)
-        if args.source_directory != None:
-            self._source_directory = args.source_directory
-
-        # This member variable defines the version of the package stored in the gar build description
-        if args.gar_version != None:
-            self._gar_version = args.gar_version
-
-        # This member variable defines the upstream version of package
-        if args.upstream_version != None:
-            self._upstream_version = args.upstream_version
-
-        # This member variable defines the relative path in the svn repository
-        if args.gar_path != None:
-            self._gar_path = args.gar_path
-
-        # This member variable defines the catalog name of the package
-        if args.catalog_name != None:
-            self._catalog_name = args.catalog_name
-
-        # This member variable defines the package name
-        if args.package_name != None:
-            self._package_name = args.package_name
-
-        # This member variable defines the date of the execution (it is useful to be able to define a date to construct history of versions)
-        if args.execution_date != None:
-            self._execution_date = args.execution_date
-
-        # This member variable defines the database to use in the connection string
-        if args.database_schema != None:
-            self._database_schema = args.database_schema
-
-        # This member variable defines the database host to use in the connection string
-        if args.database_host != None:
-            self._database_host = args.database_host
-	
-        # This member variable defines the database user to use in the connection string
-        if args.database_user != None:
-            self._database_user = args.database_user
-
-        # This member variable defines the database password to use in the connection string
-        if args.database_password != None:
-            self._database_password = args.database_password
-
-        # This member variable defines the uwatch activation status
-        if args.uwatch_deactivated != None:
-            self._uwatch_deactivated = True
-        else:
-            self._uwatch_deactivated = False
-
-        # This member variable defines the uwatch last report result
-        if args.uwatch_error != None:
-            self._uwatch_error = True
-        else:
-            self._uwatch_error = False
-
-        # This member variable defines the uwatch last report result
-        if args.uwatch_pkg_root != None:
-            self._uwatch_pkg_root = args.uwatch_pkg_root
-
-        # This member variable defines the uwatch last report output
-        if args.uwatch_output != None:
-            self._uwatch_output = args.uwatch_output
-
-        # This member variable defines the gar distfiles
-        if args.gar_distfiles != None:
-            self._gar_distfiles = args.gar_distfiles
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self):
-
-        # Initialize all variables to None. Even if useless, the purpose of this to keep up to date the list
-        self._verbose = None
-        self._uwatch_deactivated = False
-        self._uwatch_error = False
-        self._uwatch_pkg_root = None
-        self._current_version = None
-        self._current_revision = ""
-        self._regexp = None
-        self._upstream_url = None
-        self._target_version = None
-        self._source_directory = "."
-        self._target_location = "../branches"
-        self._gar_version = None
-        self._upstream_version = None
-        self._gar_path = None
-        self._catalog_name = None
-        self._package_name = None
-        self._execution_date = None
-        self._database_schema = None
-        self._database_host = None
-        self._database_user = None
-        self._database_password = None
-        self._gar_distfiles = None
-        self._uwatch_output = None
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getCurrentVersion(self):
-        return self._current_version
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getCurrentRevision(self):
-        return self._current_revision
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getRegexp(self):
-        # In case the regexp is not define, we try to guess it using the distfile
-        if (self._regexp == None) & (self._gar_distfiles != None):
-            # Instanciate a regexp generator
-            urg = UwatchRegexGenerator()
-
-            # Retrieve the regexp list
-            auto_regex_list = urg.GenerateRegex(self._catalog_name, self._gar_distfiles)
-
-            # Use the first item as current regexp
-            self._regexp = auto_regex_list[0]
-
-        return self._regexp
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getUpstreamURL(self):
-        return self._upstream_url
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getVerbose(self):
-        return self._verbose
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getSourceDirectory(self):
-        return self._source_directory
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getTargetLocation(self):
-        return self._target_location
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getTargetVersion(self):
-        return self._target_version
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getGarVersion(self):
-        return self._gar_version
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getUpstreamVersion(self):
-        return self._upstream_version
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getGarPath(self):
-        if self.getUwatchPkgRoot():
-            return self._gar_path.replace(self.getUwatchPkgRoot(), "")
-        else:
-            return self._gar_path
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getCatalogName(self):
-        return self._catalog_name
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getPackageName(self):
-        return self._package_name
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getExecutionDate(self):
-        return self._execution_date
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getDatabaseSchema(self):
-        return self._database_schema
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getDatabaseHost(self):
-        return self._database_host
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getDatabaseUser(self):
-        return self._database_user
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getDatabasePassword(self):
-        return self._database_password
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getUwatchError(self):
-        return self._uwatch_error
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getUwatchDeactivated(self):
-        return self._uwatch_deactivated
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getUwatchPkgRoot(self):
-        return self._uwatch_pkg_root
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getGarDistfiles(self):
-        return self._gar_distfiles
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getUwatchOutput(self):
-        return self._uwatch_output
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class AbstractCommand(object):
-    """Base class for command implementation. You should create a derived class per command to implemente.
-       A "command" represent a concrete action verb given to the program.
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, name):
-        self.config = UwatchConfiguration()
-        self.name = name
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getName(self):
-        return self.name
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def execute(self, opts, arguments):
-        print "Internal error : Abstract command method called\n"
-        raise AbstractCommandMethodCallException("execute")
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class UpstreamWatchCommand(AbstractCommand):
-    """UpstreamWatch command. This command is the base class used for all upstream watch commands. It provides argument checking
-    url content retrieving, version comparison, etc.
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, name):
-        super(UpstreamWatchCommand, self).__init__(name)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def UrlContentRetrieve(self, url):
-
-        try:
-            # Request the upstream URL and open it
-            req = Request(url)
-            response = urlopen(req)
-
-        except URLError, e:
-            if hasattr(e, 'reason'):
-                print 'We failed to reach a server during retrieval of : ' + url
-                print 'Reason: ', e.reason
-            elif hasattr(e, 'code'):
-                print 'The server couldn\'t fulfill the request during retrieval of : ' + url
-                print 'Error code: ', e.code
-
-            # Check for response code value. We should get a 200
-            raise UpstreamUrlRetrievalFailedException(url)
-
-        else:
-            # everything is fine, retrieve the page content
-            return response.read()
-
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def CompareVersionAndGetNewest(self, version1, version2):
-
-        # we consider the version to be composed of several elements separated by '.' ',' '-' or '_'
-        # an elements can be a string or a number
-        # at each step we extract the next elements of the two version strings and compare them
-
-        if isinstance(version1, str) == False:
-            print "Version is not a string. Please check environnement variable UFILES_REGEX"
-            print version1
-
-        if isinstance(version2, str) == False:
-            print "Version is not a string. Please check environnement variable UFILES_REGEX"
-            print version2
-
-        # Retrieve the tokens from both version. Use . - , and _ as splitters
-    	splittingRegExp = "(?:[\.,_-])"
-        tokens1 = re.split(splittingRegExp, version1)
-        tokens2 = re.split(splittingRegExp, version2)
-
-        # Iterates the toeksn of version 1, pop tokens one by one and compare to the token at same
-        # in version 2
-        while len(tokens1) > 0:
-            # If we still have tokens in version 1 and version 2 is empty, then version 1 is newer
-            # TODO: may have to deal with beta suffixes...
-            if len(tokens2) == 0:
-                return version1
-
-            # Convert both elements to integer
-            # TODO : handles chars in versions
-            elem1 = tokens1.pop(0)
-            elem2 = tokens2.pop(0)
-
-            # If both elements are integer, then convert to int before comparison, otherwise compare strings
-            try:
-                elem1 = int(elem1)
-                elem2 = int(elem2)
-            except:
-                elem1 = str(elem1)
-                elem2 = str(elem2)
-                # print "Doing string comparison"
-
-            # print "Comparing %(elem1)s and %(elem2)s" % { 'elem1' : elem1 , 'elem2' : elem2 }
-
-            # if elements are the same continue the loop
-            if elem1 == elem2:
-                continue
-
-            # Test if elem1 is more recent
-            if elem1 > elem2:
-                # print "%(elem1)s > %(elem2)s" % { 'elem1' : elem1 , 'elem2' : elem2 }
-                return version1
-            else:
-                # print "%(elem1)s < %(elem2)s" % { 'elem1' : elem1 , 'elem2' : elem2 }
-                return version2
-
-        return version1
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class CheckUpstreamCommand(UpstreamWatchCommand):
-    """CheckUpstream command. This command retrieve the upstream web page and search for a new version. Version check is
-    done by matching the regexp from the makefile on the page. Results are sorted to get the highest available and
-    compared to current version
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, name):
-        super(CheckUpstreamCommand, self).__init__(name)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def checkArgument(self):
-
-        # Variable used to flag that we have a missing argument
-        argsValid = True
-
-        # Current version is mandatory
-        if self.config.getCurrentVersion() == None:
-            print "Error : Current version is not defined. Please use --current-version flag, or --help to display help"
-            argsValid = False
-
-        # Regexp is mandatory
-        if self.config.getRegexp() == None:
-            print "Error : Regexp is not defined. Please use --regexp flag, or --help to display help"
-            argsValid = False
-
-        # UpstreamURL is mandatory
-        if self.config.getUpstreamURL() == None:
-            print "Error : Upstream version page URL is not defined. Please use --upstream-url flag, or --help to display help"
-            argsValid = False
-
-        # If arguments are not valid raise an exception
-        if argsValid == False:
-            raise MissingArgumentException("Some mandatory arguments are missing. Unable to continue.")
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def execute(self, opts, args):
-
-        try:
-
-            # Initialize configuration
-            self.config.initialize(opts)
-
-            # Need a way to check that all options needed are available
-            self.checkArgument()
-
-            # Call the method in charge of retrieving upstream content
-            content = self.UrlContentRetrieve(self.config.getUpstreamURL())
-
-            # Search the strings matching the regexp passed through command line arguments
-            p = re.compile(self.config.getRegexp())
-            matches = p.findall(content)
-
-            # Check if we have found some results
-            if len(matches) == 0:
-                raise NoUpstreamVersionFoundException(self.config.getUpstreamURL(), self.config.getRegexp())
-            else:
-                newestVersion = self.config.getCurrentVersion()
-                while len(matches) > 0:
-                    newestVersion = self.CompareVersionAndGetNewest(newestVersion, matches.pop(0))
-
-            # At the end of the processing loop, test if we have a newer version avail, if yes output it
-            if newestVersion <>  self.config.getCurrentVersion():
-                print newestVersion
-
-            # Exit after processing, eveythin gis ok, return true to the command processor
-            return True
-
-        except MissingArgumentException, (instance):
-
-            # Display a cool error message :)
-            print instance.parameter
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except UpstreamUrlRetrievalFailedException, (instance):
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except NoUpstreamVersionFoundException, (instance):
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class GetUpstreamLatestVersionCommand(UpstreamWatchCommand):
-    """GetUpstreamLatestVersion command. This command retrieve the upstream web page and search for the latest version.
-    Version check is done by matching the regexp from the makefile on the page. Results are sorted to get the newest version
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, name):
-        super(GetUpstreamLatestVersionCommand, self).__init__(name)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def checkArgument(self):
-
-        # Variable used to flag that we have a missing argument
-        argsValid = True
-
-        # Regexp is mandatory
-        if self.config.getRegexp() == None:
-            print "Error : Regexp is not defined. Please use --regexp flag, or --help to display help"
-            argsValid = False
-
-        # UpstreamURL is mandatory
-        if self.config.getUpstreamURL() == None:
-            print "Error : Upstream version page URL is not defined. Please use --upstream-url flag, or --help to display help"
-            argsValid = False
-
-        # If arguments are not valid raise an exception
-        if argsValid == False:
-            raise MissingArgumentException("Some mandatory arguments are missing. Unable to continue.")
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def execute(self, opts, args):
-
-        try:
-
-            # Initialize configuration
-            self.config.initialize(opts)
-
-            # Need a way to check that all options needed are available
-            self.checkArgument()
-    
-            # Call the method in charge of retrieving upstream content
-            content = self.UrlContentRetrieve(self.config.getUpstreamURL())
-
-            # Search the strings matching the regexp passed through command line arguments
-            p = re.compile(self.config.getRegexp())
-            matches = p.findall(content)
-
-            # Check if we have found some results
-            if len(matches) == 0:
-                raise NoUpstreamVersionFoundException(self.config.getUpstreamURL(), self.config.getRegexp())
-            else:
-                newestVersion = matches.pop(0)                
-                while len(matches) > 0:
-                    newestVersion = self.CompareVersionAndGetNewest(newestVersion, matches.pop(0))
-
-            # At the end of the processing loop, we print the version
-            print newestVersion
-
-            # Exit after processing, eveythin gis ok, return true to the command processor
-            return True
-
-        except MissingArgumentException, (instance):
-
-            # Display a cool error message :)
-            print instance.parameter
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except UpstreamUrlRetrievalFailedException, (instance):
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except NoUpstreamVersionFoundException, (instance):
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class GetUpstreamVersionListCommand(UpstreamWatchCommand):
-    """GetUpstreamVersionList command. This command retrieve the upstream web page and search for all the versions.
-    Version check is done by matching the regexp from the makefile on the page. 
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, name):
-        super(GetUpstreamVersionListCommand, self).__init__(name)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def checkArgument(self):
-
-        # Variable used to flag that we have a missing argument
-        argsValid = True
-
-        # Regexp is mandatory
-        if self.config.getRegexp() == None:
-            print "Error : Regexp is not defined. Please use --regexp flag, or --help to display help"
-            argsValid = False
-
-        # UpstreamURL is mandatory
-        if self.config.getUpstreamURL() == None:
-            print "Error : Upstream version page URL is not defined. Please use --upstream-url flag, or --help to display help"
-            argsValid = False
-
-        # If arguments are not valid raise an exception
-        if argsValid == False:
-            raise MissingArgumentException("Some mandatory arguments are missing. Unable to continue.")
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def compareAndSortVersion(self, a, b):
-        """This function is a wrapper to the comparison function. CompareVersionAndGetNewest returns the string containing
-        the newest version of the two arguments. Since sort method used on list need to have an integer return value, this
-        wrapper do the call to CompareVersionAndGetNewest and returns an int
-        """
-    
-        if self.CompareVersionAndGetNewest(a,b) == a:
-            return 1
-        else:
-            return -1
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def execute(self, opts, args):
-
-        try:
-
-            # Initialize configuration
-            self.config.initialize(opts)
-
-            # Need a way to check that all options needed are available
-            self.checkArgument()
-
-            # Call the method in charge of retrieving upstream content
-            content = self.UrlContentRetrieve(self.config.getUpstreamURL())
-
-            listURL = self.config.getUpstreamURL().split(' ')
-
-            # Search the strings matching the regexp passed through command line arguments
-            p = re.compile(self.config.getRegexp())
-            matches = p.findall(content)
-
-            # Check if we have found some results
-            if len(matches) == 0:
-                raise NoUpstreamVersionFoundException(self.config.getUpstreamURL(), self.config.getRegexp())
-            else:
-                # Remove duplicated entries
-                myList = []
-                for version in matches:
-                    myList.append(version)
-
-                l = list(set(myList))
-                l.sort(self.compareAndSortVersion)
-
-                # Print every version in the list
-                for version in l:
-                    print version
-
-            # Exit after processing, eveythin gis ok, return true to the command processor
-            return True
-
-        except MissingArgumentException, (instance):
-
-            # Display a cool error message :)
-            print instance.parameter
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except UpstreamUrlRetrievalFailedException, (instance):
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except NoUpstreamVersionFoundException, (instance):
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class UpgradeToVersionCommand(UpstreamWatchCommand):
-    """UpgradeToVersion command. This command upgrade the build description from a version to another.
-    Current files in trunk are copied to a new branch. Branch is named accord to the following pattern :
-    PKG/branches/upgrade_from_CURRENTVERSION_to_DESTVERSION. After copy, version in the Makefile is modified.
-    An optional argument can be passed to commit after branch creation.
-    
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, name):
-        super(UpgradeToVersionCommand, self).__init__(name)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def checkArgument(self):
-
-        # Variable used to flag that we have a missing argument
-        argsValid = True
-
-        # FromVersion is mandatory
-        if self.config.getCurrentVersion() == None:
-            print "Error : Current version is not defined. Please use --current-version flag, or --help to display help"
-            argsValid = False
-
-        # ToVersion is mandatory
-        if self.config.getTargetVersion() == None:
-            print "Error : Target version is not defined. Please use --target-version flag, or --help to display help"
-            argsValid = False
-
-        # ToVersion is mandatory
-        if self.config.getTargetLocation() == None:
-            print "Error : Target directory is not defined. Please use --target-location flag, or --help to display help"
-            argsValid = False
-
-        # If arguments are not valid raise an exception
-        if argsValid == False:
-            raise MissingArgumentException("Some mandatory arguments are missing. Unable to continue.")
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def checkWorkingDirectory(self):
-        """ This method checks that the command is executed from a valid working directory. A valid working directory
-            is a directory in which we find a package buildDescription that means a Makefile and a gar directory or symlink
-        """
-
-        # Check that the Makefile exist
-        if os.path.isfile(self.config.getSourceDirectory() + "/Makefile") == False:
-            # No it does not exist, thus generate an error message
-            msg = "Error : there is no Makefile under %(src)s" % { "src" : os.path.abspath(self.config.getSourceDirectory()) }
-    
-            # Then raise an exception
-            raise InvalidSourceDirectoryContentException(msg)
-
-        # Check that the gar directory exists (can be a directory or symlink)
-        if os.path.isdir(self.config.getSourceDirectory() + "/gar") == False:
-            # No it does not exist, thus generate an error message
-            msg = "Error : there is no gar directory under %(src)s" % { "src" : os.path.abspath(self.config.getSourceDirectory()) }
-    
-            # Then raise an exception
-            raise InvalidSourceDirectoryContentException(msg)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getGarRelativeTargetDirectory(self):
-        """ This method return None if gar directory is an actual directory, or a relative path if gar is a symlink to 
-            a real directory. In case of a symlink pointing to another symlink, we do not try to get the absolute path
-            having one level of indirection is enough. 
-            The target directory is a relative path. This path is adjusted to be consistent from the target directory. It
-            has to be modified since it is basically a relative path from the source directory.            
-        """
-
-        # Get the newgar information
-        garDir = self.config.getSourceDirectory() + "/gar"
-        if os.path.islink(garDir):
-            garTarget = os.path.relpath(os.path.abspath(os.readlink(garDir)), os.path.abspath(targetDir))
-        else:
-            garTarget = None
-    
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getGarRelativeTargetDirectory(self):
-        """ This method return None if gar directory is an actual directory, or a relative path if gar is a symlink to 
-            a real directory. In case of a symlink pointing to another symlink, we do not try to get the absolute path
-            having one level of indirection is enough. 
-            The target directory is a relative path. This path is adjusted to be consistent from the target directory. It
-            has to be modified since it is basically a relative path from the source directory.            
-        """
-
-        # Get the newgar information
-        garDir = self.config.getSourceDirectory() + "/gar"
-        if os.path.islink(garDir):
-            garTarget = os.path.relpath(os.path.abspath(os.readlink(garDir)), os.path.abspath(self.getTargetDirectory()))
-        else:
-            garTarget = None
-
-        return garTarget
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def getTargetDirectory(self):
-        """ This method return the target directory which is a computed value based on target location, current version
-            and target version
-        """
-
-        return self.config.getTargetLocation() + "/upgrade_from_" + self.config.getCurrentVersion() + "_to_" + self.config.getTargetVersion()
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def copySvnSourceToTarget(self, garRelativeTarget):
-        """ This method copy sources from the working copy to the target in the same working copy. If garRelativeTarget is not 
-            None, it means gar directory is a symlink. Then once copy is done it is deleted in the target directory and
-            recreated to point to the new relative directory
-        """
-
-        try:
-            # Create a new svn client
-            svnClient = pysvn.Client()
-
-            # Do the actual copy in the svn working copy
-            svnClient.copy(os.path.abspath(self.config.getSourceDirectory()), self.getTargetDirectory())
-
-            # Backup the current directory
-            curDir = os.getcwd()
-
-            # Change to target directory
-            os.chdir(self.getTargetDirectory())
-
-            # Test if gar relative path is defined
-            if garRelativeTarget:
-                # Test if gar directory is a symlink and 
-                if os.path.islink("./gar"):
-                    os.remove("./gar")
-                    os.symlink(garRelativeTarget, "./gar")
-                # No ... :( This a "should not happen error" since it was a symlink before the copy. Exit
-                else:
-                    print "Internal error : gar is not a symlink but garRelativeTarget is defined"
-                    return False
-            # No else but ... If gar relative path is not defined, we have copied a real directory. Nothing to do in this case
-
-            # Restore the working directory
-            os.chdir(curDir)
-
-        # SVN client exception handling    
-        except pysvn.ClientError , e:
-            # Generate a cool error message
-            msg = "SVN Client error : " + e.args[0] + "\n" + "Error occured when executing command svnClient.copy(%(src)s, %(dest)s)" \
-                  % { 'src' : os.path.abspath(self.config.getSourceDirectory()), 'dest' : self.getTargetDirectory() }
-
-            # Then raise the exception
-            raise SvnClientException(msg)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def modifyVersion(self):
-        """ This method modifies the version in the Makefile. It replaces current version by new version. 
-            Version has to be defined on a single line strting by VERSION, having some spaces or tabs then 
-            and egal sign = then some tabs or spaces and the version vaue to finish the line
-        """
-
-        # Backup the current directory
-        curDir = os.getcwd()
-
-        # Change to target directory
-        os.chdir(self.getTargetDirectory())
-
-        # Array storing the Makefile lines
-        lines = []
-
-        # Iterate each line in  the file                
-        for line in open("./Makefile", 'r'):
-            # Match the file line by line               
-            m = re.match(r"\s*VERSION\s*=\s*(?P<version>.*)", line)
-
-            # Test if this is a match
-            if m == None:
-                # No, thus output the current line without modifications
-                lines.append(line)
-            else:   
-                # Yes it is a match, thus output the modified line
-                lines.append("VERSION = " + self.config.getTargetVersion() + "\n")
-
-        # Open the new Makefile for output
-        f = open("./Makefile", 'w')
-
-        # Iterates the array of lines and write each one to the Makefile 
-        for element in lines:
-            f.write(element)
-
-        # Close the Makefile
-        f.close()
-
-        # Restore the working directory
-        os.chdir(curDir)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def execute(self, opts, args):
-
-        try:
-
-            # Initialize configuration
-            self.config.initialize(opts)
-
-            # Need a way to check that all options needed are available
-            self.checkArgument()
-
-            # Check that the command is launched from a valid directory
-            self.checkWorkingDirectory()
-
-            # Generates the target directory
-            self.getTargetDirectory()
-
-            # Get the new gar information
-            garRelativeTarget = self.getGarRelativeTargetDirectory()
-
-            # Copy target directory to destination
-            self.copySvnSourceToTarget(garRelativeTarget)
-
-            # Modify the version inside the Makefile
-            self.modifyVersion()
-
-            # Exit after processing, eveythin gis ok, return true to the command processor
-            return True
-
-        # Handles exception that occurs when arguments are incorrect
-        except MissingArgumentException, instance:
-
-            # Display a cool error message :)
-            print instance.parameter
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        # Handles SVN client exception
-        except SvnClientException , e:
-            
-            # Display a cool error message :)
-            print e.message
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        # Handles exceptions which might occur while checking source directory content
-        except InvalidSourceDirectoryContentException , e:
-            
-            # Display a cool error message :)
-            print e.message
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class ReportPackageVersionCommand(UpstreamWatchCommand):
-    """ReportPackageVersion command. This command report and store in the database the values of version and date passed 
-    by arguments to upstream watch. Unique key is the composed by garpath and catalog name. It means the same package can
-    lie into different path in the svn repository.
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self, name):
-        super(ReportPackageVersionCommand, self).__init__(name)
-        self.conn = None
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def openDatabaseConnection(self):
-        """This method open a connection to the mysql database using value from the configuration parser. The result of 
-        connect method is stored into a connection object
-        """
-
-        # Open the database connection
-        try:
-            self.conn = MySQLdb.connect(host   = self.config.getDatabaseHost(),
-                                       passwd = self.config.getDatabasePassword(),
-                                       db     = self.config.getDatabaseSchema(),
-                                       user   = self.config.getDatabaseUser() )
-
-        except MySQLdb.Error, e:
-            msg = "Error %d: %s" % (e.args[0], e.args[1])
-            raise DatabaseConnectionException(msg)
-
-        # Check that the object we got in return if defiend
-        if self.conn == None:
-            # No, raise a DatabaseConnectionException
-            msg = "Unable to connect to database using host = %(host)s, db = %(db)s, user = %(user)s, passwd = %(passwd)% " % { "host" : self.config.getDatabaseHost(), "passwd" : self.config.getDatabasePassword(), "db" : self.config.getDatabaseSchema(), "user" : self.config.getDatabaseUser() }
-            raise DatabaseConnectionException(msg)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def closeDatabaseConnection(self):
-        """This method close the connection opened by openDatabaseConnection. 
-        """
-
-        # Check that the connection object is valid
-        if self.conn :
-            # Yes, commit pending transactions
-            self.conn.commit()
-
-            # Close the connection
-            self.conn.close()
-        else:
-            # No,  raise a DatabaseConnectionException
-            msg = "Unable to disconnect from the database. Connection objet is not defined"
-            raise DatabaseConnectionException(msg)
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def updateVersionInDatabase(self):
-        """This method updates the version in the database. First it checks for the package to update using a unique 
-        key composed of gar svn path and catalog name. If not found the package is created, otherwise it is updated.
-        In both case, if data are writtent to the database, entries in history table are created.
-        """
-
-        try:
-            # Flag used to keep track of the fact we have created a new package. Used in some case to choose behavior
-            isNewlyCreatedPackage = False
-            
-            # Check that the connection is defined
-            if self.conn == None:
-                # No,  raise a DatabaseConnectionException
-                msg = "Unable to query the database. Connection objet is not defined"
-                raise DatabaseConnectionException(msg)
-
-            # Get a cursor object        
-            cursor = self.conn.cursor(MySQLdb.cursors.DictCursor)
-
-            # First retrieve the id_pkg and deletion flag from the database
-            cursor.execute("select * from UWATCH_PKG_VERSION where PKG_CATALOGNAME = %s", (self.config.getCatalogName() ) )
-
-            # if more than one row is found, then report an error
-            if cursor.rowcount > 1:
-                msg = self.config.getCatalogName()
-                raise DuplicatePackageException(msg)
-
-            # If rowcount = 0 then the package does not exist. It has to be inserted in the database
-            if cursor.rowcount == 0:
-
-                # Insert the package in the package version table
-                cursor.execute("insert into UWATCH_PKG_VERSION (PKG_GAR_PATH, PKG_CATALOGNAME, PKG_NAME, PKG_GAR_VERSION, PKG_LAST_GAR_CHECK_DATE) \
-                                values ( %s , %s , %s , %s , %s )" , (self.config.getGarPath(), self.config.getCatalogName(), \
-                                self.config.getPackageName(), self.config.getGarVersion(), self.config.getExecutionDate() ) )
-
-                # Flag that we have created a package
-                isNewlyCreatedPackage = True
-
-                # Output some more information if verbose mode is activated
-                if self.config.getVerbose() == True:
-                    print "Package %(pkg)s added to the database" % { 'pkg' : self.config.getCatalogName() }
-
-                # Now the package is inserted. Retrieve the newly inserted package and update other versions
-                cursor.execute("select * from UWATCH_PKG_VERSION where PKG_GAR_PATH = %s and PKG_CATALOGNAME = %s", \
-                                (self.config.getGarPath(), self.config.getCatalogName() ) )
-
-            # Retrieve package information
-            pkg = cursor.fetchone()
-
-            # Test if the deleted flag is set
-            if pkg["PKG_IS_DELETED"] == 1:                
-                # Yes thus package has to be undeleted
-                cursor.execute("update UWATCH_PKG_VERSION set PKG_IS_DELETED = 0 where ID_PKG='%s'" , ( pkg["ID_PKG"] ) )
-
-                # Output some more information if verbose mode is activated
-                if self.config.getVerbose() == True:
-                    print "Package %(pkg)s has been undeleted" % { 'pkg' : self.config.getCatalogName() }
-
-            # Test if the package has just been created. If yes the history line for gar version has to be inserted 	 
-            if isNewlyCreatedPackage: 	 
-                cursor.execute("insert into UWATCH_VERSION_HISTORY ( ID_PKG , HIST_VERSION_TYPE , HIST_VERSION_VALUE , HIST_VERSION_DATE ) values ( %s, %s, %s, %s)" , ( pkg["ID_PKG"], "gar", self.config.getGarVersion() , self.config.getExecutionDate() ) )
-                
-            # In all cases (update or not) we update the last version check according to the argument
-            cursor.execute("update UWATCH_PKG_VERSION set PKG_LAST_UPSTREAM_CHECK_DATE = %s , PKG_GAR_PATH = %s where ID_PKG= %s" , ( self.config.getExecutionDate(), self.config.getGarPath() , pkg["ID_PKG"] ) )
-
-            # Test if uwatch deactivated flag is set
-            if self.config.getUwatchDeactivated() == True:
-                # Yes thus package has to be deactivated
-                cursor.execute("update UWATCH_PKG_VERSION set PKG_UWATCH_ACTIVATED='0' where ID_PKG= %s" , ( pkg["ID_PKG"] ) )
-                if self.config.getVerbose() == True:
-                    print "%(pkg) uWatch is deactivated, updating database"  % { 'pkg' : self.config.getCatalogName() }
-            else:
-                cursor.execute("update UWATCH_PKG_VERSION set PKG_UWATCH_ACTIVATED='1' where ID_PKG= %s" , ( pkg["ID_PKG"] ) )
-                # Change execution status only if activated
-                if self.config.getUwatchError() == True:
-                    # Yes thus package has to be updated
-                    cursor.execute("update UWATCH_PKG_VERSION set PKG_LAST_UPSTREAM_CHECK_STATUS='0' where ID_PKG= %s" , ( pkg["ID_PKG"] ) )
-                    if self.config.getVerbose() == True:
-                        print "%(pkg)s uWatch reported an error, updating database"  % { 'pkg' : self.config.getCatalogName() }
-                else:
-                    cursor.execute("update UWATCH_PKG_VERSION set PKG_LAST_UPSTREAM_CHECK_STATUS='1' where ID_PKG= %s" , ( pkg["ID_PKG"] ) )
-                    if self.config.getVerbose() == True:
-                        print "%(pkg)s uWatch successfully ran, updating database"  % { 'pkg' : self.config.getCatalogName() }
-
-                # Test if upstream version is passed
-                if self.config.getUpstreamVersion():
-                    # In all cases (update or not) we update the last version check according to the argument
-                    cursor.execute("update UWATCH_PKG_VERSION set PKG_LAST_UPSTREAM_CHECK_DATE = %s , PKG_GAR_PATH = %s where ID_PKG= %s" , ( self.config.getExecutionDate(), self.config.getGarPath() , pkg["ID_PKG"] ) )
-
-                    # Yes, compare current upstream version from commandline and database
-                    if self.config.getUpstreamVersion() != pkg["PKG_UPSTREAM_VERSION"]:                
-                        # Yes thus package has to be updated
-                        cursor.execute("update UWATCH_PKG_VERSION set PKG_UPSTREAM_VERSION = %s  where ID_PKG= %s" , ( self.config.getUpstreamVersion(), pkg["ID_PKG"] ) )
-                        cursor.execute("insert into UWATCH_VERSION_HISTORY ( ID_PKG , HIST_VERSION_TYPE , HIST_VERSION_VALUE , HIST_VERSION_DATE ) \
-                                        values ( %s, %s, %s, %s)" , ( pkg["ID_PKG"], "upstream", self.config.getUpstreamVersion() , self.config.getExecutionDate() ) )
-
-                        # Output some more information if verbose mode is activated
-                        if self.config.getVerbose() == True:
-                            print "Upgrading %(pkg)s upstream version from %(current)s to %(next)s" % { 'pkg' : self.config.getCatalogName(), \
-                                    'next' : self.config.getUpstreamVersion() , 'current' : pkg["PKG_UPSTREAM_VERSION"] }
-                    else:
-                        # Output some more information if verbose mode is activated
-                        if self.config.getVerbose() == True:
-                            print "%(pkg) GAR version is up to date (%(current)s)" % { 'pkg' : self.config.getCatalogName(), 'current' : self.config.getUpstreamVersion() }         
-    
-            # Test if gar version is passed (it is mandatory to have a value in database)
-            if self.config.getGarVersion():
-                # In all cases (update or not) we update the last version check according to the argument
-                cursor.execute("update UWATCH_PKG_VERSION set PKG_LAST_GAR_CHECK_DATE = %s  where ID_PKG= %s" , ( self.config.getExecutionDate(), pkg["ID_PKG"] ) )
-
-                # Yes, compare current gar version from commandline and database
-                if self.config.getGarVersion() != pkg["PKG_GAR_VERSION"]:                
-                    # Yes thus package has to be updated
-                    cursor.execute("update UWATCH_PKG_VERSION set PKG_GAR_VERSION = %s  where ID_PKG= %s" , ( self.config.getGarVersion(), pkg["ID_PKG"] ) )
-                    cursor.execute("insert into UWATCH_VERSION_HISTORY ( ID_PKG , HIST_VERSION_TYPE , HIST_VERSION_VALUE , HIST_VERSION_DATE ) \
-                                    values ( %s, %s, %s, %s)" , ( pkg["ID_PKG"], "gar", self.config.getGarVersion() , self.config.getExecutionDate() ) )
-
-                    # Output some more information if verbose mode is activated
-                    if self.config.getVerbose() == True:
-                        print "Upgrading %(pkg)s gar version from %(current)s to %(next)s" % { 'pkg' : self.config.getCatalogName(), \
-                                'next' : self.config.getGarVersion() , 'current' : pkg["PKG_GAR_VERSION"] }
-
-            # Before closing the connection, there is a last thing to do... storing uwatch configuration into the database
-
-            # Yes, compare current gar version from commandline and database
-            cursor.execute("update UWATCH_PKG_VERSION set PKG_GAR_DISTFILES = %s, PKG_UFILES_REGEXP = %s, PKG_UPSTREAM_MASTER_SITES = %s, PKG_UWATCH_LAST_OUTPUT = %s where ID_PKG= %s" , ( self.config.getGarDistfiles(), self.config.getRegexp(), self.config.getUpstreamURL(), self.config.getUwatchOutput(), pkg["ID_PKG"] ) )
-
-            # Close the cursor on the database
-            cursor.close()
-
-        except MySQLdb.Error, e:
-            msg = "Error %d: %s" % (e.args[0], e.args[1])
-            raise DatabaseConnectionException(msg)
-
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def checkArgument(self):
-
-        # Variable used to flag that we have a missing argument
-        argsValid = True
-
-        # Gar path is mandatory
-        if self.config.getGarPath() == None:
-            print "Error : Gar path is not defined. Please use --gar-path flag, or --help to display help"
-            argsValid = False
-
-        # Gar distfiles is mandatory
-        if self.config.getGarDistfiles() == None:
-            print "Error : Gar distfiles is not defined. Please use --gar-distfiles flag, or --help to display help"
-            argsValid = False
-
-        # Gar distfiles is mandatory
-        if self.config.getUwatchOutput() == None:
-            print "Error : uWatch output is not defined. Please use --uwatch-output flag, or --help to display help"
-            argsValid = False
-
-        # Catalog name is mandatory
-        if self.config.getCatalogName() == None:
-            print "Error : Catalog name is not defined. Please use --catalog-name flag, or --help to display help"
-            argsValid = False
-
-        # Package name is mandatory
-        if self.config.getPackageName() == None:
-            print "Error : Package name is not defined. Please use --package-name flag, or --help to display help"
-            argsValid = False
-
-        # Execution date is mandatory
-        if self.config.getExecutionDate() == None:
-            print "Error : Execution date is not defined. Please use --execution-date flag, or --help to display help"
-            argsValid = False
-
-        # Gar version is mandatory, other version are optional. Gar the version is the only mandatory in the database
-        # It has to be passed in argument in case the package does not exist yet
-        if self.config.getGarVersion() == None:
-            print "Error : Gar version is not defined. Please use --gar-version flag, or --help to display help"
-            argsValid = False
-
-        # Database schema is mandatory
-        if self.config.getDatabaseSchema() == None:
-            print "Error : Database schema is not defined. Please define the value in the ~/.uwatchrc file, use --database-schema flag, or --help to display help"
-            argsValid = False
-
-        # Database host is mandatory
-        if self.config.getDatabaseHost() == None:
-            print "Error : Database host is not defined. Please define the value in the ~/.uwatchrc file, use --database-host flag, or --help to display help"
-            argsValid = False
-
-        # Database user is mandatory
-        if self.config.getDatabaseUser() == None:
-            print "Error : Database user is not defined. Please define the value in the ~/.uwatchrc file, use --database-user flag, or --help to display help"
-            argsValid = False
-
-        # Database password is mandatory
-        if self.config.getDatabasePassword() == None:
-            print "Error : Database password is not defined. Please define the value in the ~/.uwatchrc file, use --database-password flag, or --help to display help"
-            argsValid = False
-
-        # Regexp is mandatory
-        if self.config.getRegexp() == None:
-            print "Error : Regexp is not defined. Please use --regexp flag, or --help to display help"
-            argsValid = False
-
-        # UpstreamURL is mandatory
-        if self.config.getUpstreamURL() == None:
-            print "Error : Upstream version page URL is not defined. Please use --upstream-url flag, or --help to display help"
-            argsValid = False
-    
-        # If arguments are not valid raise an exception
-        if argsValid == False:
-            raise MissingArgumentException("Some mandatory arguments are missing. Unable to continue.")
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def execute(self, opts, args):
-
-        try:
-
-            # Initialize configuration
-            self.config.initialize(opts)
-
-            # Need a way to check that all options needed are available
-            self.checkArgument()
-
-            # Connection to the database
-            self.openDatabaseConnection()
-
-            # Connection to the database
-            self.updateVersionInDatabase()
-
-            # Connection to the database
-            self.closeDatabaseConnection()
-
-            # Exit after processing, eveythin gis ok, return true to the command processor
-            return True
-
-        except MissingArgumentException, (instance):
-
-            # Display a cool error message :)
-            print instance.parameter
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except InvalidArgumentException, (instance):
-
-            # Display a cool error message :)
-            print instance.parameter
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-        except DatabaseConnectionException, (instance):
-
-            # Display a cool error message :)
-            print instance.message
-
-            # Exits through exception handling, thus return false to the command processor
-            return False
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-#
-class CommandProcessor(object):
-    """This class receive commands from the main loop and forward call to concrete command.
-    """
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def __init__(self):
-        """Initialize the objects in charge of concrete command processing. Each object instance are stored in a
-        map using a key which is the action verb used on the command line.
-        """
-
-        # Defines the map storing the concrete commands
-        self.commandArray = {}
-
-        # Creates all the concrete commands
-        cmd = CheckUpstreamCommand("check-upstream")
-        self.commandArray[cmd.getName()] = cmd
-
-        cmd = GetUpstreamLatestVersionCommand("get-upstream-latest-version")
-        self.commandArray[cmd.getName()] = cmd
-
-        cmd = GetUpstreamVersionListCommand("get-upstream-version-list")
-        self.commandArray[cmd.getName()] = cmd
-
-        cmd = UpgradeToVersionCommand("upgrade-to-version")
-        self.commandArray[cmd.getName()] = cmd
-
-        cmd = ReportPackageVersionCommand("update-package-version-database")
-        self.commandArray[cmd.getName()] = cmd
-
-    # -----------------------------------------------------------------------------------------------------------------
-
-    def execute(self, opts, arguments):
-        """This method checks that an action is supplied and call the action handler
-        """
-
-        # Check that an action verb is supplied. If none an error is returned
-        if len(arguments) == 0:
-            print "Error : no action supplied"
-            return 1
-
-        # The first element in the arguments array is the action verb. Retrieve the command
-        # using action verb as key
-        if self.commandArray.has_key(arguments[0]):
-            res =  self.commandArray[arguments[0]].execute(opts, arguments)
-            if res:
-                return 0
-            else:
-                return 1
-        else:
-            print "Error : %(action)s action is not supported" % { 'action' : arguments[0] }
-            return 2
-
-
-class UwatchRegexGenerator(object):
-  
-  WS_RE = re.compile(r'\s+')
-  DIGIT_RE = re.compile(r'\d+')
-  DIGIT_REMOVAL_RE = re.compile(r'\d+(?:\.\d+)*[a-z]?')
-  DIGIT_MATCH_MAKE_RE_1 = r'(\d+(?:\.\d+)*[a-z]?)'
-  DIGIT_MATCH_MAKE_RE_2 = r'(\d+(?:\.\d+)*)'
-  ARCHIVE_RE = re.compile(r"\.(?:tar(?:\.(?:gz|bz2))|tgz)?$")
-
-  def _ChooseDistfile(self, file_list):
-    # First heuristic: files with numbers are distfiles
-    for f in file_list:
-      if self.ARCHIVE_RE.search(f):
-        return f
-    for f in file_list:
-      if self.DIGIT_RE.search(f):
-        return f
-
-  def _SeparateSoftwareName(self, catalogname, filename):
-    """Separate the software name from the rest of the file name.
-
-    Software name sometimes contains digits, which we don't want to
-    include in the regexes.
-    """
-    # The first approach is to split by '-'
-    assert filename
-    parts = filename.split('-')
-    if self._CanBeSoftwarename(parts[0], catalogname):
-      return parts[0], '-' + '-'.join(parts[1:])
-    return '', filename
-  
-  def _SeparateArchiveName(self, filename):
-    if self.ARCHIVE_RE.search(filename):
-      first_part = self.ARCHIVE_RE.split(filename)[0]
-      archive_part = ''.join(self.ARCHIVE_RE.findall(filename))
-      return first_part, archive_part
-    return filename, ''
-
-  def _CanBeSoftwarename(self, s, catalogname):
-    if s == catalogname:
-      return True
-    # This is stupid.  But let's wait for a real world counterexample.
-    return True
-
-  def GenerateRegex(self, catalogname, distnames):
-    dist_list = self.WS_RE.split(distnames)
-    dist_file = self._ChooseDistfile(dist_list)
-    if not dist_file:
-      return []
-    softwarename, rest_of_filename = self._SeparateSoftwareName(
-        catalogname, dist_file)
-    rest_of_filename, archive_part = self._SeparateArchiveName(rest_of_filename)
-    no_numbers = self.DIGIT_REMOVAL_RE.split(rest_of_filename)
-    regex_list = []
-    regex_list.append(softwarename + self.DIGIT_MATCH_MAKE_RE_1.join(no_numbers) + archive_part)
-    regex_list.append(softwarename + self.DIGIT_MATCH_MAKE_RE_2.join(no_numbers) + archive_part)
-    return regex_list
-
-
-
-# ---------------------------------------------------------------------------------------------------------------------
-#
-# Fonction principale
-#
-def main():
-    """Program main loop. Process args and call concrete command action.
-    """
-
-    # Create the command processor object
-    commandProcessor = CommandProcessor()
-
-    # Parse command line arguments
-    cliParser  = CommandLineParser()
-
-    # Call the command line parser
-    (opts, args) = cliParser.parse()
-
-    # Call the execute method on the command processor. This method is in charge to find the concrete command
-    return commandProcessor.execute(opts, args)
-
-# Exit with main return code
-if __name__ == '__main__':
-    res = main()
-    sys.exit(res)
-
+link ../lib/python/uwatch.py
\ No newline at end of file


Property changes on: csw/mgar/gar/v2/bin/uwatch
___________________________________________________________________
Deleted: svn:executable
   - *
Added: svn:special
   + *

Copied: csw/mgar/gar/v2/lib/python/uwatch.py (from rev 13360, csw/mgar/gar/v2/bin/uwatch)
===================================================================
--- csw/mgar/gar/v2/lib/python/uwatch.py	                        (rev 0)
+++ csw/mgar/gar/v2/lib/python/uwatch.py	2011-02-18 15:14:18 UTC (rev 13361)
@@ -0,0 +1,1675 @@
+#!/opt/csw/bin/python2.6
+
+# TODO : check arguments for valid date
+# TODO : check arguments for emtpy strings
+
+#
+# The contents of this file are subject to the COMMON DEVELOPMENT AND
+# DISTRIBUTION LICENSE (CDDL) (the "License"); you may not use this
+# file except in compliance with the License.
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either the GNU General Public License Version 3 or later (the "GPL"),
+# in which case the provisions of the GPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL, and not to allow others to
+# use your version of this file under the terms of the CDDL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the CDDL, or the GPL.
+#
+# Copyright 2010 OpenCSW (http://www.opencsw.org).  All rights reserved.
+# Use is subject to license terms.
+#
+#
+# Contributors list :
+#
+#    William Bonnet wbonnet at opencsw.org
+#
+#
+
+# Import all the needed modules
+import sys
+import string
+import re
+import os
+import shutil
+import subprocess
+import pysvn
+import MySQLdb
+import datetime
+import ConfigParser
+
+from urllib2 import Request, urlopen, URLError
+from optparse import OptionParser
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class InvalidSourceDirectoryContentException(Exception):
+    """Exception raised when a method is called on the Abstract command class
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, message):
+        self.message = message
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class AbstractCommandMethodCallException(Exception):
+    """Exception raised when a method is called on the Abstract command class
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, message):
+        self.message = message
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class SvnClientException(Exception):
+    """Exception raised when an error occur while using svnClient
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, message):
+        self.message = message
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class DatabaseConnectionException(Exception):
+    """Exception raised when an error occur while connecting to the database
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, message):
+        self.message = message
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class DuplicatePackageException(Exception):
+    """Exception raised when an error occur while connecting to the database
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, message):
+        self.message = message
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class UpstreamUrlRetrievalFailedException(Exception):
+    """Exception raised when an unsuported protocol is specified in the upstream url
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, url):
+        self.url  = url
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class NoUpstreamVersionFoundException(Exception):
+    """Exception raised when searching the upstream page content does not match the regexp
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, url, regexp):
+        self.url     = url
+        self.regexp  = regexp
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class MissingArgumentException(Exception):
+    """Exception raised when a command line argument is missing
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, value):
+        self.parameter = value
+
+    def __str__(self):
+        return repr(self.parameter)
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class InvalidArgumentException(Exception):
+    """Exception raised when a command line argument is invalid. For instance an invalid version or date
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self, value):
+        self.parameter = value
+
+    def __str__(self):
+        return repr(self.parameter)
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class CommandLineParser(object):
+    """This class is used to parse command line. It process only options. Command verb is parsed by the main procedure
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self):
+        # Create the parser object
+        self.optionParser = OptionParser()
+
+        # Add options to parser
+        self.optionParser.add_option("--verbose",     help="Activate verbose mode", action="store_true", dest="verbose")
+        self.optionParser.add_option("--current-version",    help="Current package version", action="store", dest="current_version")
+        self.optionParser.add_option("--target-location",    help="Target location. This is the directory in which the branch will be created (parent of the branch directory). Default value is ../branches", action="store", dest="target_location")
+        self.optionParser.add_option("--regexp",            help="Version matching regular expression", action="store", dest="regexp")
+        self.optionParser.add_option("--source-directory",  help="Source directory (place from where the build is copied). Default value is current directory", action="store", dest="source_directory")
+        self.optionParser.add_option("--target-version",    help="Package target version", action="store", dest="target_version")
+        self.optionParser.add_option("--upstream-url",      help="Upstream version page url", action="store", dest="upstream_url")
+
+        # Option used for reporting uwatch result
+        self.optionParser.add_option("--uwatch-error",      help="Flag used to report a uwatch error", action="store_true", dest="uwatch_error")
+        self.optionParser.add_option("--uwatch-output",     help="Flag used to report the uwatch output", action="store", dest="uwatch_output")
+        self.optionParser.add_option("--uwatch-deactivated",help="Flag used to report a uwatch error", action="store_true", dest="uwatch_deactivated")
+        self.optionParser.add_option("--uwatch-pkg-root",   help="Defines the uwatch package root working directory", action="store", dest="uwatch_pkg_root")
+
+        # Option used for storing version information in the database
+        self.optionParser.add_option("--gar-distfiles",     help="Gar version of the package", action="store", dest="gar_distfiles")
+        self.optionParser.add_option("--gar-version",       help="Gar version of the package", action="store", dest="gar_version")
+        self.optionParser.add_option("--upstream-version",  help="Upstream version of the package", action="store", dest="upstream_version")
+        self.optionParser.add_option("--gar-path",          help="Relative path in svn repository", action="store", dest="gar_path")
+        self.optionParser.add_option("--catalog-name",      help="Catalog name", action="store", dest="catalog_name")
+        self.optionParser.add_option("--package-name",      help="Package name", action="store", dest="package_name")
+        self.optionParser.add_option("--execution-date",    help="Check date to be stored in the database", action="store", dest="execution_date")
+
+        self.optionParser.add_option("--database-schema",   help="Defines the database to use in the connection string", action="store", dest="database_schema")
+        self.optionParser.add_option("--database-host",     help="Defines the database host to use in the connection string", action="store", dest="database_host")
+        self.optionParser.add_option("--database-user",     help="Defines the database user to use in the connection string", action="store", dest="database_user")
+        self.optionParser.add_option("--database-password", help="Defines the database password to use in the connection string", action="store", dest="database_password")
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def parse(self):
+        (self.options, self.args) = self.optionParser.parse_args()
+        return self.options, self.args
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class UwatchConfiguration(object):
+    """This handles parameters retrieved either from command line or configuration file.
+    """
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def initialize(self, args):
+        """Initialize configuration object. If configurations contains files reference, values from the files are
+        read and copied into this object. Next attempts to retrieve files stored information will read values from
+        this object.
+        """
+
+        # Default is no file parser
+        fileParser = None
+
+        # Test if the .uwatchrc file exists
+        if os.path.isfile( os.path.expanduser("~/.uwatchrc") ):
+            # Yes thus load values from the configuration file before processing args parameter
+            # This allow to override from the command line some values stored in the config file
+            fileParser = ConfigParser.ConfigParser()
+            fileParser.read( [os.path.expanduser("~/.uwatchrc") ] )
+
+            # Read the database schema from the config file            
+            try:
+                self._database_schema = fileParser.get("main", "database-schema")
+            except Config.NoOptionError:
+                self._database_schema = None
+
+            # Read the database hostname from the config file            
+            try:
+                self._database_host = fileParser.get("main", "database-host")
+            except Config.NoOptionError:
+                self._database_host = None
+
+            # Read the database user from the config file            
+            try:
+                self._database_user = fileParser.get("main", "database-user")
+            except Config.NoOptionError:
+                self._database_user = None
+
+            # Read the database password from the config file            
+            try:
+                self._database_password = fileParser.get("main", "database-password")
+            except Config.NoOptionError:
+                self._database_password = None
+
+            # Read the package root working dir from the config file            
+            try:
+                self._uwatch_pkg_root = fileParser.get("main", "uwatch-pkg-root")
+            except Config.NoOptionError:
+                self._uwatch_pkg_root = None
+
+        # This member variable is a flag which defines the status of the verbose mode (True : activated)
+        if args.verbose != None:
+            self._verbose = args.verbose
+        else:
+            self._verbose = False
+
+        # This member variable defines the value of the version of the package
+        # Current revision is not passed as a separated argument. It is part of the opencsw version number. 
+        # Package version are defined as follow : version[,REV=revision]*
+        if args.current_version != None:
+    
+            # Parse the version string
+            ver = re.split(r"(?P<version>.*),REV=(?P<revision>.*)", args.current_version)
+
+            # Test if this is a match
+            if ver == None:
+                # No, thus raise an exception
+                msg = "Unable to parse %(version)s as a valid package version" % { 'version' : args.current_version }
+                raise InvalidArgumentException(msg)
+            else:      
+                # If the length of array is one, the no revision is provided
+                if len(ver) == 1:
+                    self._current_version = ver[0]
+                    self._current_revision = ""
+                else:
+                    self._current_version = ver[1]
+                    self._current_revision = ver[2]
+
+                    # Attempt to split again the string. If len is greater than 1
+                    # Then there are at least two rev string => raise exception
+                    ver = re.split(r"(?P<version>.*),REV=(?P<revision>.*)", self._current_version)
+                    if len(ver) > 1:
+                        msg = "Unable to parse %(version)s as a valid package version. There are more than one revision string" % { 'version' : args.current_version }
+                        raise InvalidArgumentException(msg)
+
+        # This member variable defines the value of the regexp used to match the upstream web page
+        if args.regexp != None:
+            self._regexp = args.regexp
+
+        # This member variable defines the url of the upstream web page used to check for new version
+        if args.upstream_url != None:
+            self._upstream_url = args.upstream_url
+
+        # This member variable defines the target version of the package during upgrade
+        if args.target_version != None:
+            self._target_version = args.target_version
+
+        # This member variable defines the target directory of the package during upgrade. This is the location of the new branch
+        if args.target_location != None:
+            self._target_location = args.target_location
+
+        # This member variable defines the source directory of the package during upgrade. This is the location of the trunk (most of the time)
+        if args.source_directory != None:
+            self._source_directory = args.source_directory
+
+        # This member variable defines the version of the package stored in the gar build description
+        if args.gar_version != None:
+            self._gar_version = args.gar_version
+
+        # This member variable defines the upstream version of package
+        if args.upstream_version != None:
+            self._upstream_version = args.upstream_version
+
+        # This member variable defines the relative path in the svn repository
+        if args.gar_path != None:
+            self._gar_path = args.gar_path
+
+        # This member variable defines the catalog name of the package
+        if args.catalog_name != None:
+            self._catalog_name = args.catalog_name
+
+        # This member variable defines the package name
+        if args.package_name != None:
+            self._package_name = args.package_name
+
+        # This member variable defines the date of the execution (it is useful to be able to define a date to construct history of versions)
+        if args.execution_date != None:
+            self._execution_date = args.execution_date
+
+        # This member variable defines the database to use in the connection string
+        if args.database_schema != None:
+            self._database_schema = args.database_schema
+
+        # This member variable defines the database host to use in the connection string
+        if args.database_host != None:
+            self._database_host = args.database_host
+	
+        # This member variable defines the database user to use in the connection string
+        if args.database_user != None:
+            self._database_user = args.database_user
+
+        # This member variable defines the database password to use in the connection string
+        if args.database_password != None:
+            self._database_password = args.database_password
+
+        # This member variable defines the uwatch activation status
+        if args.uwatch_deactivated != None:
+            self._uwatch_deactivated = True
+        else:
+            self._uwatch_deactivated = False
+
+        # This member variable defines the uwatch last report result
+        if args.uwatch_error != None:
+            self._uwatch_error = True
+        else:
+            self._uwatch_error = False
+
+        # This member variable defines the uwatch last report result
+        if args.uwatch_pkg_root != None:
+            self._uwatch_pkg_root = args.uwatch_pkg_root
+
+        # This member variable defines the uwatch last report output
+        if args.uwatch_output != None:
+            self._uwatch_output = args.uwatch_output
+
+        # This member variable defines the gar distfiles
+        if args.gar_distfiles != None:
+            self._gar_distfiles = args.gar_distfiles
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def __init__(self):
+
+        # Initialize all variables to None. Even if useless, the purpose of this to keep up to date the list
+        self._verbose = None
+        self._uwatch_deactivated = False
+        self._uwatch_error = False
+        self._uwatch_pkg_root = None
+        self._current_version = None
+        self._current_revision = ""
+        self._regexp = None
+        self._upstream_url = None
+        self._target_version = None
+        self._source_directory = "."
+        self._target_location = "../branches"
+        self._gar_version = None
+        self._upstream_version = None
+        self._gar_path = None
+        self._catalog_name = None
+        self._package_name = None
+        self._execution_date = None
+        self._database_schema = None
+        self._database_host = None
+        self._database_user = None
+        self._database_password = None
+        self._gar_distfiles = None
+        self._uwatch_output = None
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getCurrentVersion(self):
+        return self._current_version
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getCurrentRevision(self):
+        return self._current_revision
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getRegexp(self):
+        # In case the regexp is not define, we try to guess it using the distfile
+        if (self._regexp == None) & (self._gar_distfiles != None):
+            # Instanciate a regexp generator
+            urg = UwatchRegexGenerator()
+
+            # Retrieve the regexp list
+            auto_regex_list = urg.GenerateRegex(self._catalog_name, self._gar_distfiles)
+
+            # Use the first item as current regexp
+            self._regexp = auto_regex_list[0]
+
+        return self._regexp
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getUpstreamURL(self):
+        return self._upstream_url
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getVerbose(self):
+        return self._verbose
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getSourceDirectory(self):
+        return self._source_directory
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getTargetLocation(self):
+        return self._target_location
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getTargetVersion(self):
+        return self._target_version
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getGarVersion(self):
+        return self._gar_version
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getUpstreamVersion(self):
+        return self._upstream_version
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getGarPath(self):
+        if self.getUwatchPkgRoot():
+            return self._gar_path.replace(self.getUwatchPkgRoot(), "")
+        else:
+            return self._gar_path
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getCatalogName(self):
+        return self._catalog_name
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getPackageName(self):
+        return self._package_name
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getExecutionDate(self):
+        return self._execution_date
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getDatabaseSchema(self):
+        return self._database_schema
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getDatabaseHost(self):
+        return self._database_host
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getDatabaseUser(self):
+        return self._database_user
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getDatabasePassword(self):
+        return self._database_password
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getUwatchError(self):
+        return self._uwatch_error
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getUwatchDeactivated(self):
+        return self._uwatch_deactivated
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getUwatchPkgRoot(self):
+        return self._uwatch_pkg_root
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getGarDistfiles(self):
+        return self._gar_distfiles
+
+    # -----------------------------------------------------------------------------------------------------------------
+
+    def getUwatchOutput(self):
+        return self._uwatch_output
+
+
+# ---------------------------------------------------------------------------------------------------------------------
+#
+#
+class AbstractCommand(object):

@@ Diff output truncated at 100000 characters. @@

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.


More information about the devel mailing list