diff options
Diffstat (limited to 'distutils2')
| -rw-r--r-- | distutils2/command/install_data.py | 69 | ||||
| -rw-r--r-- | distutils2/command/install_dist.py | 4 | ||||
| -rw-r--r-- | distutils2/command/install_distinfo.py | 21 | ||||
| -rw-r--r-- | distutils2/config.py | 26 |
4 files changed, 76 insertions, 44 deletions
diff --git a/distutils2/command/install_data.py b/distutils2/command/install_data.py index e77b11c..6fe3805 100644 --- a/distutils2/command/install_data.py +++ b/distutils2/command/install_data.py @@ -9,6 +9,7 @@ platform-independent data files.""" import os from distutils2.command.cmd import Command from distutils2.util import change_root, convert_path +from distutils2._backport.sysconfig import _expand_vars, _subst_vars, get_paths class install_data(Command): @@ -28,6 +29,7 @@ class install_data(Command): def initialize_options(self): self.install_dir = None self.outfiles = [] + self.data_files_out = [] self.root = None self.force = 0 self.data_files = self.distribution.data_files @@ -40,50 +42,32 @@ class install_data(Command): def run(self): self.mkpath(self.install_dir) - for f in self.data_files: - if isinstance(f, str): - # it's a simple file, so copy it - f = convert_path(f) - if self.warn_dir: - self.warn("setup script did not provide a directory for " - "'%s' -- installing right in '%s'" % - (f, self.install_dir)) - (out, _) = self.copy_file(f, self.install_dir) - self.outfiles.append(out) - else: - # it's a tuple with path to install to and a list of files - dir = convert_path(f[0]) - if not os.path.isabs(dir): - dir = os.path.join(self.install_dir, dir) - elif self.root: - dir = change_root(self.root, dir) - self.mkpath(dir) - - if f[1] == []: - # If there are no files listed, the user must be - # trying to create an empty directory, so add the - # directory to the list of output files. - self.outfiles.append(dir) - else: - # Copy files, adding them to the list of output files. - for data in f[1]: - data = convert_path(data) - (out, _) = self.copy_file(data, dir) - self.outfiles.append(out) + for file in self.data_files.items(): + destination = convert_path(self.expand_categories(file[1])) + dir_dest = os.path.abspath(os.path.dirname(destination)) + + self.mkpath(dir_dest) + (out, _) = self.copy_file(file[0], dir_dest) + + self.outfiles.append(out) + self.data_files_out.append((file[0], destination)) + + def expand_categories(self, path_with_categories): + local_vars = get_paths() + local_vars['distribution.name'] = self.distribution.metadata['Name'] + expanded_path = _subst_vars(path_with_categories, local_vars) + expanded_path = _subst_vars(expanded_path, local_vars) + if '{' in expanded_path and '}' in expanded_path: + self.warn("Unable to expand %s, some categories may missing." % + path_with_categories) + return expanded_path def get_source_files(self): sources = [] - for item in self.data_files: - if isinstance(item, str): # plain file - item = convert_path(item) - if os.path.isfile(item): - sources.append(item) - else: # a (dirname, filenames) tuple - dirname, filenames = item - for f in filenames: - f = convert_path(f) - if os.path.isfile(f): - sources.append(f) + for file in self.data_files: + destination = convert_path(self.expand_categories(file[1])) + if os.path.file(destination): + sources.append(destination) return sources def get_inputs(self): @@ -91,3 +75,6 @@ class install_data(Command): def get_outputs(self): return self.outfiles + + def get_datafiles_out(self): + return self.data_files_out
\ No newline at end of file diff --git a/distutils2/command/install_dist.py b/distutils2/command/install_dist.py index 146c905..23f3c5f 100644 --- a/distutils2/command/install_dist.py +++ b/distutils2/command/install_dist.py @@ -87,6 +87,8 @@ class install_dist(Command): ('record=', None, "filename in which to record a list of installed files " "(not PEP 376-compliant)"), + ('datafiles=', None, + "data files mapping"), # .dist-info related arguments, read by install_dist_info ('no-distinfo', None, @@ -184,12 +186,14 @@ class install_dist(Command): #self.install_info = None self.record = None + self.datafiles = None # .dist-info related options self.no_distinfo = None self.installer = None self.requested = None self.no_record = None + self.no_datafiles = None # -- Option finalizing methods ------------------------------------- # (This is rather more involved than for most commands, diff --git a/distutils2/command/install_distinfo.py b/distutils2/command/install_distinfo.py index 6e76546..3df90cd 100644 --- a/distutils2/command/install_distinfo.py +++ b/distutils2/command/install_distinfo.py @@ -39,9 +39,11 @@ class install_distinfo(Command): "do not generate a REQUESTED file"), ('no-record', None, "do not generate a RECORD file"), + ('no-datafiles', None, + "do not generate a DATAFILES list installed file") ] - boolean_options = ['requested', 'no-record'] + boolean_options = ['requested', 'no-record', 'no-datafiles'] negative_opt = {'no-requested': 'requested'} @@ -50,6 +52,7 @@ class install_distinfo(Command): self.installer = None self.requested = None self.no_record = None + self.no_datafiles = None def finalize_options(self): self.set_undefined_options('install_dist', @@ -142,6 +145,22 @@ class install_distinfo(Command): finally: f.close() + if not self.no_datafiles: + datafiles_path = os.path.join(self.distinfo_dir, 'DATAFILES') + logger.info('creating %s', datafiles_path) + f = open(datafiles_path, 'wb') + try: + writer = csv.writer(f, delimiter=',', + lineterminator=os.linesep, + quotechar='"') + install_data = self.get_finalized_command('install_data') + if install_data.get_datafiles_out() != '': + for tuple in install_data.get_datafiles_out(): + writer.writerow(tuple) + finally: + f.close() + + def get_outputs(self): return self.outputs diff --git a/distutils2/config.py b/distutils2/config.py index 8609e76..53f84ed 100644 --- a/distutils2/config.py +++ b/distutils2/config.py @@ -2,14 +2,17 @@ Know how to read all config files Distutils2 uses. """ +import os.path import os import sys +import re from ConfigParser import RawConfigParser from distutils2 import logger from distutils2.util import check_environ, resolve_name from distutils2.compiler import set_compiler from distutils2.command import set_command +from distutils2.datafiles import resources_dests class Config(object): """Reads configuration files and work with the Distribution instance @@ -82,7 +85,7 @@ class Config(object): if v != ''] return value - def _read_setup_cfg(self, parser): + def _read_setup_cfg(self, parser, filename): content = {} for section in parser.sections(): content[section] = dict(parser.items(section)) @@ -164,6 +167,25 @@ class Config(object): # manifest template self.dist.extra_files = files.get('extra_files', []) + + if 'resources' in content: + resources = [] + regex = re.compile(r'[^\\](?:\\{2})* ') + for glob, destination in content['resources'].iteritems(): + splitted_glob = regex.split(glob, 1) + if len(splitted_glob) == 1: + prefix = '' + suffix = splitted_glob[0] + else: + prefix = splitted_glob[0] + suffix = splitted_glob[1] + + resources.append((prefix, suffix, destination)) + + dir = os.path.dirname(os.path.join(os.getcwd(), filename)) + data_files = resources_dests(dir, resources) + self.dist.data_files = data_files + def parse_config_files(self, filenames=None): if filenames is None: @@ -178,7 +200,7 @@ class Config(object): parser.read(filename) if os.path.split(filename)[-1] == 'setup.cfg': - self._read_setup_cfg(parser) + self._read_setup_cfg(parser, filename) for section in parser.sections(): if section == 'global': |
