summaryrefslogtreecommitdiff
path: root/distutils2
diff options
context:
space:
mode:
Diffstat (limited to 'distutils2')
-rw-r--r--distutils2/command/install_data.py69
-rw-r--r--distutils2/command/install_dist.py4
-rw-r--r--distutils2/command/install_distinfo.py21
-rw-r--r--distutils2/config.py26
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':