Changeset 75

Show
Ignore:
Timestamp:
06/24/06 09:40:42 (7 years ago)
Author:
mk
Message:

Added support for eggs (closes ticket #34).

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/mk/cheesecake/cheesecake_index.py

    r74 r75  
    2828from util import run_cmd, command_successful 
    2929from util import unzip_package, untar_package 
     30from util import mkdirs 
    3031from util import StdoutRedirector 
    3132import logger 
     
    322323        self.subindices.append(index) 
    323324        self._indices_dict[index.name] = index 
     325 
     326    def remove_subindex(self, index_name): 
     327        """Remove subindex (refered by name). 
     328 
     329        :Parameters: 
     330          `index` : Index name 
     331              Index name to be removed. 
     332        """ 
     333        index = self._indices_dict[index_name] 
     334        self.subindices.remove(index) 
     335        del self._indices_dict[index_name] 
    324336 
    325337    def _print_info_one(self): 
     
    773785 
    774786class CheesecakeError(Exception): 
    775     """ 
    776     Custom exception class for Cheesecake-specific errors 
     787    """Custom exception class for Cheesecake-specific errors. 
    777788    """ 
    778789    pass 
     
    829840            "tgz": untar_package, 
    830841            "zip": unzip_package, 
     842            "egg": unzip_package, 
    831843        } 
    832844 
     
    841853            self.index["INSTALLABILITY"].add_subindex(IndexUrlDownload()) 
    842854 
     855        # Get package name. 
    843856        self.determine_pkg_name() 
     857 
     858        # Configure logging as soon as possible. 
    844859        self.configure_logging(logfile) 
    845         #self.set_defaults() 
    846         #self.get_config() 
     860 
     861        # Get package,  
    847862        self.retrieve_pkg() 
     863 
     864        # Get package name and type. 
     865        self.package_name, self.package_type = self.get_package_name_and_type(self.package) 
     866        self.log.debug("Package name: " + self.package_name) 
     867        self.log.debug("Package type: " + self.package_type) 
     868 
     869        # Unpack package and list its files. 
    848870        self.unpack_pkg() 
    849871        self.walk_pkg() 
     872 
     873        # Install package. 
    850874        self.install_pkg() 
     875 
     876        # When checking an egg exclude irrelevant indices. 
     877        if self.package_type == 'egg': 
     878            self.index["INSTALLABILITY"].remove_subindex('setup.py') 
     879            self.index["INSTALLABILITY"].remove_subindex('unpack_dir') 
     880            self.index["INSTALLABILITY"].remove_subindex('generated_files') 
    851881 
    852882    def raise_exception(self, msg): 
     
    9731003        except ImportError, e: 
    9741004            msg = "Error: setuptools is not installed and is required for downloading a package by name\n" 
    975             msg += "You can donwload and process a package by its full URL via the -u or --url option\n" 
     1005            msg += "You can download and process a package by its full URL via the -u or --url option\n" 
    9761006            msg += "Example: python cheesecake.py --url=http://www.mems-exchange.org/software/durus/Durus-3.1.tar.gz" 
    9771007            self.raise_exception(msg) 
     1008 
     1009        def drop_setuptools_info(stdout, error=None): 
     1010            """Drop all setuptools output as INFO. 
     1011            """ 
     1012            self.log.info("*** Begin setuptools output") 
     1013            map(self.log.info, stdout.splitlines()) 
     1014            if error: 
     1015                self.log.info(str(error)) 
     1016            self.log.info("*** End setuptools output") 
    9781017 
    9791018        try: 
     
    9861025                                    self.sandbox, 
    9871026                                    force_scan=True, 
    988                                     source=True) 
     1027                                    source=False) 
    9891028            captured_stdout = sys.stdout.read_buffer() 
    9901029            sys.stdout = old_stdout 
     
    9971036            log.set_threshold(old_threshold) 
    9981037 
    999             # Drop all setuptools output as INFO. 
    1000             self.log.info("*** Begin setuptools output") 
    1001             map(self.log.info, captured_stdout.splitlines()) 
    1002             self.log.info(str(e)) 
    1003             self.log.info("*** End setuptools output") 
    1004  
    1005             msg = "Error: setuptools returned an error: %s\n" % e 
    1006             self.raise_exception(msg) 
     1038            drop_setuptools_info(captured_stdout, error) 
     1039            self.raise_exception("Error: setuptools returned an error: %s\n" % e) 
    10071040 
    10081041        if output is None: 
     1042            drop_setuptools_info(captured_stdout) 
    10091043            self.raise_exception("Error: Could not find distribution for " + self.name) 
    10101044 
     
    10631097        shutil.copyfile(self.package_path, self.sandbox_pkg_file) 
    10641098 
     1099    def get_package_name_and_type(self, package): 
     1100        """Return package name and type. 
     1101 
     1102        Raise an exception when package type cannot be recognized. 
     1103        """ 
     1104        for type in self.package_types.keys(): 
     1105            s = re.search(r"(.+)\.%s" % type, package) 
     1106            if s: 
     1107                # Package name is name of package without file extension (ex. twill-7.3). 
     1108                return s.group(1), type 
     1109 
     1110        msg = "Could not determine package type for package '%s'" % package 
     1111        msg += "\nCurrently recognized types: " + ", ".join(self.package_types.keys()) 
     1112        self.raise_exception(msg) 
     1113 
    10651114    def unpack_pkg(self): 
    10661115        """Unpack the package in the sandbox directory. 
     
    10721121          original_package_name : str 
    10731122        """ 
    1074         self.package_type = "" 
    1075  
    1076         for type in self.package_types.keys(): 
    1077             s = re.search(r"(.+)\.%s" % type, self.package) 
    1078             if s: 
    1079                 # package_name is name of package without file extension (ex. twill-7.3) 
    1080                 self.package_name = s.group(1) 
    1081                 self.package_type = type 
    1082                 break 
    1083         if not self.package_type: 
    1084             msg = "Could not determine package type for package '%s'" % self.package 
    1085             msg += "\nCurrently recognized types: " + " ".join(self.package_types) 
    1086             self.raise_exception(msg) 
    1087         self.log.debug("Package name: " + self.package_name) 
    1088         self.log.debug("Package type: " + self.package_type) 
    1089  
    10901123        self.sandbox_pkg_dir = os.path.join(self.sandbox, self.package_name) 
    10911124        if os.path.isdir(self.sandbox_pkg_dir): 
     
    11601193        self.sandbox_install_dir = os.path.join(self.sandbox, "tmp_install_%s" % self.package_name) 
    11611194 
    1162         cwd = os.getcwd() 
    1163         os.chdir(os.path.join(self.sandbox, self.package_name)) 
    1164  
    1165         rc, output = run_cmd("python setup.py install --root=" + self.sandbox_install_dir) 
    1166  
    1167         # Install succeeded 
    1168         if not rc: 
     1195        if self.package_type == 'egg': 
     1196            # Create dummy Python directories. 
     1197            mkdirs('%s/lib/python2.3/site-packages/' % self.sandbox_install_dir) 
     1198            mkdirs('%s/lib/python2.4/site-packages/' % self.sandbox_install_dir) 
     1199 
     1200            environment = {'PYTHONPATH': 
     1201                           '%(sandbox)s/lib/python2.3/site-packages/:'\ 
     1202                           '%(sandbox)s/lib/python2.4/site-packages/' % \ 
     1203                           {'sandbox': self.sandbox_install_dir}} 
     1204            rc, output = run_cmd("easy_install --no-deps --prefix %s %s" % \ 
     1205                                 (self.sandbox_install_dir, self.sandbox_pkg_file), 
     1206                                 environment) 
     1207        else: 
     1208            cwd = os.getcwd() 
     1209            os.chdir(os.path.join(self.sandbox, self.package_name)) 
     1210            rc, output = run_cmd("python setup.py install --root=" + self.sandbox_install_dir) 
     1211            os.chdir(cwd) 
     1212 
     1213        if rc: 
     1214            self.log('*** Installation failed. Captured output:') 
     1215            for output_line in output.splitlines(): 
     1216                self.log(output_line) 
     1217            self.log('*** End of captured output.') 
     1218        else: 
    11691219            self.installed = True 
    1170  
    1171         os.chdir(cwd) 
    11721220 
    11731221    def compute_cheesecake_index(self): 
  • branches/mk/cheesecake/util.py

    r58 r75  
    99PAD_VALUE = 4 
    1010 
    11 def run_cmd(cmd): 
    12     """ 
    13     Run command and return its return code and its output 
     11def run_cmd(cmd, env=None): 
     12    """Run command and return its return code and its output. 
    1413    """ 
    1514    arglist = cmd.split() 
    1615    try: 
    17         p = Popen(arglist, stdout=PIPE, stderr=STDOUT
     16        p = Popen(arglist, stdout=PIPE, stderr=STDOUT, env=env
    1817    except ProcessError, e: 
    1918        return 1, e 
     
    149148    tarinfo = t.members[0] 
    150149    return tarinfo.name.split(os.sep)[0] 
     150 
     151def mkdirs(dir): 
     152    """Make directory with parent directories as needed. 
     153 
     154    Don't throw an exception if directory exists. 
     155    """ 
     156    parts = dir.split(os.path.sep) 
     157    for length in xrange(1, len(parts)+1): 
     158        path = os.path.sep.join([''] + parts[:length]) 
     159        if not os.path.exists(path): 
     160            os.mkdir(path) 
  • branches/mk/tests/unit/test_index_class.py

    r55 r75  
    77    >>> big_index = Index() 
    88    >>> index = Index() 
     9    >>> index.name = 'small_index' 
    910 
    1011Add one index to another. 
     
    1819      ... 
    1920    ValueError: subindex have to be instance of Index 
     21 
     22Now remove subindex. 
     23    >>> big_index.remove_subindex('small_index') 
     24    >>> index in big_index.subindices 
     25    False 
    2026"""