blob: 894d7d44c5d1d9b7f1ce10e32344a9e1537c3393 [file] [log] [blame]
Greg Warda82122b2000-02-17 23:56:15 +00001"""distutils.command.sdist
2
3Implements the Distutils 'sdist' command (create a source distribution)."""
4
5# created 1999/09/22, Greg Ward
6
Greg Ward3ce77fd2000-03-02 01:49:45 +00007__revision__ = "$Id$"
Greg Warda82122b2000-02-17 23:56:15 +00008
Greg Ward4571ac12000-07-30 01:05:02 +00009import sys, os, string
Greg Warda82122b2000-02-17 23:56:15 +000010from types import *
11from glob import glob
Greg Warda82122b2000-02-17 23:56:15 +000012from distutils.core import Command
Greg Wardab3a0f32000-08-05 01:31:54 +000013from distutils import dir_util, dep_util, file_util, archive_util
Greg Warda82122b2000-02-17 23:56:15 +000014from distutils.text_file import TextFile
Greg Ward6b24dff2000-07-30 01:47:16 +000015from distutils.errors import *
Greg Ward4571ac12000-07-30 01:05:02 +000016from distutils.filelist import FileList
Greg Warda82122b2000-02-17 23:56:15 +000017
18
Greg Ward34593812000-06-24 01:23:37 +000019def show_formats ():
20 """Print all possible values for the 'formats' option (used by
21 the "--help-formats" command-line option).
22 """
23 from distutils.fancy_getopt import FancyGetopt
24 from distutils.archive_util import ARCHIVE_FORMATS
25 formats=[]
26 for format in ARCHIVE_FORMATS.keys():
27 formats.append(("formats=" + format, None,
28 ARCHIVE_FORMATS[format][2]))
29 formats.sort()
30 pretty_printer = FancyGetopt(formats)
31 pretty_printer.print_help(
32 "List of available source distribution formats:")
33
Greg Ward1993f9a2000-02-18 00:13:53 +000034class sdist (Command):
Greg Warda82122b2000-02-17 23:56:15 +000035
36 description = "create a source distribution (tarball, zip file, etc.)"
37
Greg Wardbbeceea2000-02-18 00:25:39 +000038 user_options = [
39 ('template=', 't',
40 "name of manifest template file [default: MANIFEST.in]"),
41 ('manifest=', 'm',
42 "name of manifest file [default: MANIFEST]"),
43 ('use-defaults', None,
44 "include the default file set in the manifest "
45 "[default; disable with --no-defaults]"),
Greg Ward499822d2000-06-29 02:06:29 +000046 ('no-defaults', None,
47 "don't include the default file set"),
48 ('prune', None,
49 "specifically exclude files/directories that should not be "
50 "distributed (build tree, RCS/CVS dirs, etc.) "
51 "[default; disable with --no-prune]"),
52 ('no-prune', None,
53 "don't automatically exclude anything"),
Greg Ward839d5322000-04-26 01:14:33 +000054 ('manifest-only', 'o',
Greg Wardc3c8c6e2000-06-08 00:46:45 +000055 "just regenerate the manifest and then stop "
56 "(implies --force-manifest)"),
Greg Ward839d5322000-04-26 01:14:33 +000057 ('force-manifest', 'f',
Greg Wardbbeceea2000-02-18 00:25:39 +000058 "forcibly regenerate the manifest and carry on as usual"),
Greg Wardbbeceea2000-02-18 00:25:39 +000059 ('formats=', None,
Greg Ward2ff78872000-06-24 00:23:20 +000060 "formats for source distribution (comma-separated list)"),
Greg Wardaf64aed2000-09-25 01:51:01 +000061 ('keep-temp', 'k',
Greg Wardbbeceea2000-02-18 00:25:39 +000062 "keep the distribution tree around after creating " +
63 "archive file(s)"),
Greg Wardc0614102000-07-05 03:06:46 +000064 ('dist-dir=', 'd',
65 "directory to put the source distribution archive(s) in "
66 "[default: dist]"),
Greg Wardbbeceea2000-02-18 00:25:39 +000067 ]
Greg Wardf1fe1032000-06-08 00:14:18 +000068
Greg Ward99b032e2000-09-25 01:41:15 +000069 boolean_options = ['use-defaults', 'prune',
70 'manifest-only', 'force-manifest',
Greg Wardaf64aed2000-09-25 01:51:01 +000071 'keep-temp']
Greg Wardf1fe1032000-06-08 00:14:18 +000072
Greg Ward9d17a7a2000-06-07 03:00:06 +000073 help_options = [
74 ('help-formats', None,
Greg Ward2ff78872000-06-24 00:23:20 +000075 "list available distribution formats", show_formats),
Greg Wardfa9ff762000-10-14 04:06:40 +000076 ]
Greg Ward9d17a7a2000-06-07 03:00:06 +000077
Greg Ward499822d2000-06-29 02:06:29 +000078 negative_opt = {'no-defaults': 'use-defaults',
79 'no-prune': 'prune' }
Greg Warda82122b2000-02-17 23:56:15 +000080
81 default_format = { 'posix': 'gztar',
82 'nt': 'zip' }
83
Greg Warde01149c2000-02-18 00:35:22 +000084 def initialize_options (self):
Greg Warda82122b2000-02-17 23:56:15 +000085 # 'template' and 'manifest' are, respectively, the names of
86 # the manifest template and manifest file.
87 self.template = None
88 self.manifest = None
89
90 # 'use_defaults': if true, we will include the default file set
91 # in the manifest
92 self.use_defaults = 1
Greg Ward499822d2000-06-29 02:06:29 +000093 self.prune = 1
Greg Warda82122b2000-02-17 23:56:15 +000094
95 self.manifest_only = 0
96 self.force_manifest = 0
97
98 self.formats = None
Greg Wardaf64aed2000-09-25 01:51:01 +000099 self.keep_temp = 0
Greg Wardc0614102000-07-05 03:06:46 +0000100 self.dist_dir = None
Greg Warda82122b2000-02-17 23:56:15 +0000101
Greg Wardd87eb732000-06-01 01:10:56 +0000102 self.archive_files = None
103
Greg Warda82122b2000-02-17 23:56:15 +0000104
Greg Warde01149c2000-02-18 00:35:22 +0000105 def finalize_options (self):
Greg Warda82122b2000-02-17 23:56:15 +0000106 if self.manifest is None:
107 self.manifest = "MANIFEST"
108 if self.template is None:
109 self.template = "MANIFEST.in"
110
Greg Ward62d5a572000-06-04 15:12:51 +0000111 self.ensure_string_list('formats')
Greg Warda82122b2000-02-17 23:56:15 +0000112 if self.formats is None:
113 try:
114 self.formats = [self.default_format[os.name]]
115 except KeyError:
116 raise DistutilsPlatformError, \
Greg Ward578c10d2000-03-31 02:50:04 +0000117 "don't know how to create source distributions " + \
118 "on platform %s" % os.name
Greg Warda82122b2000-02-17 23:56:15 +0000119
Greg Wardcb1f4c42000-09-30 18:27:54 +0000120 bad_format = archive_util.check_archive_formats(self.formats)
Greg Ward6a9a5452000-04-22 03:11:55 +0000121 if bad_format:
122 raise DistutilsOptionError, \
123 "unknown archive format '%s'" % bad_format
124
Greg Wardc0614102000-07-05 03:06:46 +0000125 if self.dist_dir is None:
126 self.dist_dir = "dist"
127
Greg Warda82122b2000-02-17 23:56:15 +0000128
129 def run (self):
130
Greg Ward23266fe2000-07-30 01:30:31 +0000131 # 'filelist' contains the list of files that will make up the
132 # manifest
133 self.filelist = FileList()
Greg Warda82122b2000-02-17 23:56:15 +0000134
135 # Ensure that all required meta-data is given; warn if not (but
136 # don't die, it's not *that* serious!)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000137 self.check_metadata()
Greg Warda82122b2000-02-17 23:56:15 +0000138
139 # Do whatever it takes to get the list of files to process
140 # (process the manifest template, read an existing manifest,
Greg Ward23266fe2000-07-30 01:30:31 +0000141 # whatever). File list is accumulated in 'self.filelist'.
Greg Wardcb1f4c42000-09-30 18:27:54 +0000142 self.get_file_list()
Greg Warda82122b2000-02-17 23:56:15 +0000143
144 # If user just wanted us to regenerate the manifest, stop now.
145 if self.manifest_only:
146 return
147
148 # Otherwise, go ahead and create the source distribution tarball,
149 # or zipfile, or whatever.
Greg Wardcb1f4c42000-09-30 18:27:54 +0000150 self.make_distribution()
Greg Warda82122b2000-02-17 23:56:15 +0000151
152
153 def check_metadata (self):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000154 """Ensure that all required elements of meta-data (name, version,
155 URL, (author and author_email) or (maintainer and
156 maintainer_email)) are supplied by the Distribution object; warn if
157 any are missing.
158 """
Greg Ward535f2d92000-04-21 04:37:12 +0000159 metadata = self.distribution.metadata
Greg Warda82122b2000-02-17 23:56:15 +0000160
161 missing = []
162 for attr in ('name', 'version', 'url'):
Greg Wardcb1f4c42000-09-30 18:27:54 +0000163 if not (hasattr(metadata, attr) and getattr(metadata, attr)):
164 missing.append(attr)
Greg Warda82122b2000-02-17 23:56:15 +0000165
166 if missing:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000167 self.warn("missing required meta-data: " +
168 string.join(missing, ", "))
Greg Warda82122b2000-02-17 23:56:15 +0000169
Greg Ward535f2d92000-04-21 04:37:12 +0000170 if metadata.author:
171 if not metadata.author_email:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000172 self.warn("missing meta-data: if 'author' supplied, " +
173 "'author_email' must be supplied too")
Greg Ward535f2d92000-04-21 04:37:12 +0000174 elif metadata.maintainer:
175 if not metadata.maintainer_email:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000176 self.warn("missing meta-data: if 'maintainer' supplied, " +
177 "'maintainer_email' must be supplied too")
Greg Warda82122b2000-02-17 23:56:15 +0000178 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000179 self.warn("missing meta-data: either (author and author_email) " +
180 "or (maintainer and maintainer_email) " +
181 "must be supplied")
Greg Warda82122b2000-02-17 23:56:15 +0000182
183 # check_metadata ()
184
185
186 def get_file_list (self):
187 """Figure out the list of files to include in the source
Greg Ward23266fe2000-07-30 01:30:31 +0000188 distribution, and put it in 'self.filelist'. This might involve
Greg Warde0c8c2f2000-06-08 00:24:01 +0000189 reading the manifest template (and writing the manifest), or just
190 reading the manifest, or just using the default file set -- it all
191 depends on the user's options and the state of the filesystem.
192 """
Greg Wardb2db0eb2000-06-21 03:29:57 +0000193
194 # If we have a manifest template, see if it's newer than the
195 # manifest; if so, we'll regenerate the manifest.
Greg Ward23266fe2000-07-30 01:30:31 +0000196 template_exists = os.path.isfile(self.template)
Greg Warda82122b2000-02-17 23:56:15 +0000197 if template_exists:
Greg Wardab3a0f32000-08-05 01:31:54 +0000198 template_newer = dep_util.newer(self.template, self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000199
Greg Wardb2db0eb2000-06-21 03:29:57 +0000200 # The contents of the manifest file almost certainly depend on the
201 # setup script as well as the manifest template -- so if the setup
202 # script is newer than the manifest, we'll regenerate the manifest
203 # from the template. (Well, not quite: if we already have a
204 # manifest, but there's no template -- which will happen if the
205 # developer elects to generate a manifest some other way -- then we
206 # can't regenerate the manifest, so we don't.)
Greg Ward9821bf42000-08-29 01:15:18 +0000207 self.debug_print("checking if %s newer than %s" %
208 (self.distribution.script_name, self.manifest))
209 setup_newer = dep_util.newer(self.distribution.script_name,
210 self.manifest)
Greg Wardb2db0eb2000-06-21 03:29:57 +0000211
212 # cases:
213 # 1) no manifest, template exists: generate manifest
214 # (covered by 2a: no manifest == template newer)
215 # 2) manifest & template exist:
216 # 2a) template or setup script newer than manifest:
217 # regenerate manifest
218 # 2b) manifest newer than both:
219 # do nothing (unless --force or --manifest-only)
220 # 3) manifest exists, no template:
221 # do nothing (unless --force or --manifest-only)
222 # 4) no manifest, no template: generate w/ warning ("defaults only")
223
Greg Wardd3b76a82000-09-06 02:08:24 +0000224 manifest_outofdate = (template_exists and
225 (template_newer or setup_newer))
226 force_regen = self.force_manifest or self.manifest_only
227 manifest_exists = os.path.isfile(self.manifest)
228 neither_exists = (not template_exists and not manifest_exists)
Greg Warda82122b2000-02-17 23:56:15 +0000229
Greg Wardd3b76a82000-09-06 02:08:24 +0000230 # Regenerate the manifest if necessary (or if explicitly told to)
231 if manifest_outofdate or neither_exists or force_regen:
Greg Warda82122b2000-02-17 23:56:15 +0000232 if not template_exists:
Greg Ward23266fe2000-07-30 01:30:31 +0000233 self.warn(("manifest template '%s' does not exist " +
234 "(using default file list)") %
235 self.template)
Greg Warda82122b2000-02-17 23:56:15 +0000236
Greg Ward6b24dff2000-07-30 01:47:16 +0000237 self.filelist.findall()
238
Greg Warda82122b2000-02-17 23:56:15 +0000239 # Add default file set to 'files'
240 if self.use_defaults:
Greg Ward23266fe2000-07-30 01:30:31 +0000241 self.add_defaults()
Greg Warda82122b2000-02-17 23:56:15 +0000242
243 # Read manifest template if it exists
244 if template_exists:
Greg Ward23266fe2000-07-30 01:30:31 +0000245 self.read_template()
Greg Warda82122b2000-02-17 23:56:15 +0000246
Greg Ward499822d2000-06-29 02:06:29 +0000247 # Prune away any directories that don't belong in the source
248 # distribution
249 if self.prune:
250 self.prune_file_list()
Greg Wardce15c6c2000-06-08 01:06:02 +0000251
Greg Warda82122b2000-02-17 23:56:15 +0000252 # File list now complete -- sort it so that higher-level files
253 # come first
Greg Ward23266fe2000-07-30 01:30:31 +0000254 self.filelist.sort()
Greg Warda82122b2000-02-17 23:56:15 +0000255
256 # Remove duplicates from the file list
Greg Ward23266fe2000-07-30 01:30:31 +0000257 self.filelist.remove_duplicates()
Greg Warda82122b2000-02-17 23:56:15 +0000258
259 # And write complete file list (including default file set) to
260 # the manifest.
Greg Ward23266fe2000-07-30 01:30:31 +0000261 self.write_manifest()
Greg Warda82122b2000-02-17 23:56:15 +0000262
263 # Don't regenerate the manifest, just read it in.
264 else:
Greg Ward23266fe2000-07-30 01:30:31 +0000265 self.read_manifest()
Greg Warda82122b2000-02-17 23:56:15 +0000266
267 # get_file_list ()
268
269
Greg Ward4a7319c2000-06-08 00:52:52 +0000270 def add_defaults (self):
Greg Ward23266fe2000-07-30 01:30:31 +0000271 """Add all the default files to self.filelist:
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000272 - README or README.txt
273 - setup.py
274 - test/test*.py
275 - all pure Python modules mentioned in setup script
276 - all C sources listed as part of extensions or C libraries
277 in the setup script (doesn't catch C headers!)
278 Warns if (README or README.txt) or setup.py are missing; everything
279 else is optional.
280 """
Greg Ward14c8d052000-06-08 01:22:48 +0000281
Greg Wardd3b76a82000-09-06 02:08:24 +0000282 standards = [('README', 'README.txt'), self.distribution.script_name]
Greg Warda82122b2000-02-17 23:56:15 +0000283 for fn in standards:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000284 if type(fn) is TupleType:
Greg Warda82122b2000-02-17 23:56:15 +0000285 alts = fn
Greg Ward48401122000-02-24 03:17:43 +0000286 got_it = 0
Greg Warda82122b2000-02-17 23:56:15 +0000287 for fn in alts:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000288 if os.path.exists(fn):
Greg Warda82122b2000-02-17 23:56:15 +0000289 got_it = 1
Greg Wardcb1f4c42000-09-30 18:27:54 +0000290 self.filelist.append(fn)
Greg Warda82122b2000-02-17 23:56:15 +0000291 break
292
293 if not got_it:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000294 self.warn("standard file not found: should have one of " +
295 string.join(alts, ', '))
Greg Warda82122b2000-02-17 23:56:15 +0000296 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000297 if os.path.exists(fn):
298 self.filelist.append(fn)
Greg Warda82122b2000-02-17 23:56:15 +0000299 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000300 self.warn("standard file '%s' not found" % fn)
Greg Warda82122b2000-02-17 23:56:15 +0000301
Greg Ward14c8d052000-06-08 01:22:48 +0000302 optional = ['test/test*.py', 'setup.cfg']
Greg Warda82122b2000-02-17 23:56:15 +0000303 for pattern in optional:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000304 files = filter(os.path.isfile, glob(pattern))
Greg Warda82122b2000-02-17 23:56:15 +0000305 if files:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000306 self.filelist.extend(files)
Greg Warda82122b2000-02-17 23:56:15 +0000307
Greg Ward578c10d2000-03-31 02:50:04 +0000308 if self.distribution.has_pure_modules():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000309 build_py = self.get_finalized_command('build_py')
310 self.filelist.extend(build_py.get_source_files())
Greg Warda82122b2000-02-17 23:56:15 +0000311
Greg Ward578c10d2000-03-31 02:50:04 +0000312 if self.distribution.has_ext_modules():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000313 build_ext = self.get_finalized_command('build_ext')
314 self.filelist.extend(build_ext.get_source_files())
Greg Warda82122b2000-02-17 23:56:15 +0000315
Greg Ward60908f12000-04-09 03:51:40 +0000316 if self.distribution.has_c_libraries():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000317 build_clib = self.get_finalized_command('build_clib')
318 self.filelist.extend(build_clib.get_source_files())
Greg Ward60908f12000-04-09 03:51:40 +0000319
Greg Ward4a7319c2000-06-08 00:52:52 +0000320 # add_defaults ()
321
Greg Warda82122b2000-02-17 23:56:15 +0000322
Greg Warda82122b2000-02-17 23:56:15 +0000323 def read_template (self):
Greg Warda82122b2000-02-17 23:56:15 +0000324
Greg Ward23266fe2000-07-30 01:30:31 +0000325 """Read and parse the manifest template file named by
326 'self.template' (usually "MANIFEST.in"). The parsing and
327 processing is done by 'self.filelist', which updates itself
328 accordingly.
329 """
330 self.announce("reading manifest template '%s'" % self.template)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000331 template = TextFile(self.template,
332 strip_comments=1,
333 skip_blanks=1,
334 join_lines=1,
335 lstrip_ws=1,
336 rstrip_ws=1,
337 collapse_join=1)
Greg Warda82122b2000-02-17 23:56:15 +0000338
Greg Warda82122b2000-02-17 23:56:15 +0000339 while 1:
Greg Warda82122b2000-02-17 23:56:15 +0000340 line = template.readline()
341 if line is None: # end of file
342 break
343
Greg Ward6b24dff2000-07-30 01:47:16 +0000344 try:
345 self.filelist.process_template_line(line)
346 except DistutilsTemplateError, msg:
347 self.warn("%s, line %d: %s" % (template.filename,
348 template.current_line,
349 msg))
Greg Warda82122b2000-02-17 23:56:15 +0000350
351 # read_template ()
352
353
Greg Wardce15c6c2000-06-08 01:06:02 +0000354 def prune_file_list (self):
355 """Prune off branches that might slip into the file list as created
Greg Ward499822d2000-06-29 02:06:29 +0000356 by 'read_template()', but really don't belong there:
357 * the build tree (typically "build")
358 * the release tree itself (only an issue if we ran "sdist"
Greg Wardaf64aed2000-09-25 01:51:01 +0000359 previously with --keep-temp, or it aborted)
Greg Ward499822d2000-06-29 02:06:29 +0000360 * any RCS or CVS directories
Greg Wardce15c6c2000-06-08 01:06:02 +0000361 """
362 build = self.get_finalized_command('build')
363 base_dir = self.distribution.get_fullname()
Greg Wardce15c6c2000-06-08 01:06:02 +0000364
Greg Ward23266fe2000-07-30 01:30:31 +0000365 self.filelist.exclude_pattern(None, prefix=build.build_base)
366 self.filelist.exclude_pattern(None, prefix=base_dir)
367 self.filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1)
Greg Wardf8b9e202000-06-08 00:08:14 +0000368
369
Greg Warda82122b2000-02-17 23:56:15 +0000370 def write_manifest (self):
Greg Ward23266fe2000-07-30 01:30:31 +0000371 """Write the file list in 'self.filelist' (presumably as filled in
372 by 'add_defaults()' and 'read_template()') to the manifest file
373 named by 'self.manifest'.
Greg Warde0c8c2f2000-06-08 00:24:01 +0000374 """
Greg Wardab3a0f32000-08-05 01:31:54 +0000375 self.execute(file_util.write_file,
Greg Ward23266fe2000-07-30 01:30:31 +0000376 (self.manifest, self.filelist.files),
Greg Wardf8b9e202000-06-08 00:08:14 +0000377 "writing manifest file '%s'" % self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000378
379 # write_manifest ()
380
381
382 def read_manifest (self):
Greg Warde0c8c2f2000-06-08 00:24:01 +0000383 """Read the manifest file (named by 'self.manifest') and use it to
Greg Ward23266fe2000-07-30 01:30:31 +0000384 fill in 'self.filelist', the list of files to include in the source
Greg Warde0c8c2f2000-06-08 00:24:01 +0000385 distribution.
386 """
Greg Wardf8b9e202000-06-08 00:08:14 +0000387 self.announce("reading manifest file '%s'" % self.manifest)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000388 manifest = open(self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000389 while 1:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000390 line = manifest.readline()
Greg Warda82122b2000-02-17 23:56:15 +0000391 if line == '': # end of file
392 break
393 if line[-1] == '\n':
394 line = line[0:-1]
Greg Wardcb1f4c42000-09-30 18:27:54 +0000395 self.filelist.append(line)
Greg Warda82122b2000-02-17 23:56:15 +0000396
397 # read_manifest ()
398
399
Greg Warda82122b2000-02-17 23:56:15 +0000400 def make_release_tree (self, base_dir, files):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000401 """Create the directory tree that will become the source
402 distribution archive. All directories implied by the filenames in
403 'files' are created under 'base_dir', and then we hard link or copy
404 (if hard linking is unavailable) those files into place.
405 Essentially, this duplicates the developer's source tree, but in a
406 directory named after the distribution, containing only the files
407 to be distributed.
408 """
Greg Ward578c10d2000-03-31 02:50:04 +0000409 # Create all the directories under 'base_dir' necessary to
Greg Ward5fad2682000-09-06 02:18:59 +0000410 # put 'files' there; the 'mkpath()' is just so we don't die
411 # if the manifest happens to be empty.
412 self.mkpath(base_dir)
413 dir_util.create_tree(base_dir, files,
414 verbose=self.verbose, dry_run=self.dry_run)
Greg Warda82122b2000-02-17 23:56:15 +0000415
416 # And walk over the list of files, either making a hard link (if
417 # os.link exists) to each one that doesn't already exist in its
418 # corresponding location under 'base_dir', or copying each file
419 # that's out-of-date in 'base_dir'. (Usually, all files will be
420 # out-of-date, because by default we blow away 'base_dir' when
421 # we're done making the distribution archives.)
422
Greg Wardcb1f4c42000-09-30 18:27:54 +0000423 if hasattr(os, 'link'): # can make hard links on this system
Greg Ward578c10d2000-03-31 02:50:04 +0000424 link = 'hard'
Greg Warda82122b2000-02-17 23:56:15 +0000425 msg = "making hard links in %s..." % base_dir
Greg Ward578c10d2000-03-31 02:50:04 +0000426 else: # nope, have to copy
427 link = None
Greg Warda82122b2000-02-17 23:56:15 +0000428 msg = "copying files to %s..." % base_dir
429
Greg Ward5fad2682000-09-06 02:18:59 +0000430 if not files:
431 self.warn("no files to distribute -- empty manifest?")
432 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000433 self.announce(msg)
Greg Warda82122b2000-02-17 23:56:15 +0000434 for file in files:
Greg Ward5fad2682000-09-06 02:18:59 +0000435 if not os.path.isfile(file):
436 self.warn("'%s' not a regular file -- skipping" % file)
437 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000438 dest = os.path.join(base_dir, file)
439 self.copy_file(file, dest, link=link)
Greg Warda82122b2000-02-17 23:56:15 +0000440
Andrew M. Kuchlinga7f225d2001-03-22 03:10:05 +0000441 self.distribution.metadata.write_pkg_info(base_dir)
442
Greg Warda82122b2000-02-17 23:56:15 +0000443 # make_release_tree ()
444
Greg Warda82122b2000-02-17 23:56:15 +0000445 def make_distribution (self):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000446 """Create the source distribution(s). First, we create the release
447 tree with 'make_release_tree()'; then, we create all required
448 archive files (according to 'self.formats') from the release tree.
449 Finally, we clean up by blowing away the release tree (unless
Greg Wardaf64aed2000-09-25 01:51:01 +0000450 'self.keep_temp' is true). The list of archive files created is
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000451 stored so it can be retrieved later by 'get_archive_files()'.
452 """
Greg Ward578c10d2000-03-31 02:50:04 +0000453 # Don't warn about missing meta-data here -- should be (and is!)
454 # done elsewhere.
Greg Ward0ae7f762000-04-22 02:51:25 +0000455 base_dir = self.distribution.get_fullname()
Greg Wardc0614102000-07-05 03:06:46 +0000456 base_name = os.path.join(self.dist_dir, base_dir)
Greg Warda82122b2000-02-17 23:56:15 +0000457
Greg Wardcb1f4c42000-09-30 18:27:54 +0000458 self.make_release_tree(base_dir, self.filelist.files)
Greg Wardd87eb732000-06-01 01:10:56 +0000459 archive_files = [] # remember names of files we create
Greg Warda82122b2000-02-17 23:56:15 +0000460 for fmt in self.formats:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000461 file = self.make_archive(base_name, fmt, base_dir=base_dir)
Greg Wardd87eb732000-06-01 01:10:56 +0000462 archive_files.append(file)
463
464 self.archive_files = archive_files
Greg Warda82122b2000-02-17 23:56:15 +0000465
Greg Wardaf64aed2000-09-25 01:51:01 +0000466 if not self.keep_temp:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000467 dir_util.remove_tree(base_dir, self.verbose, self.dry_run)
Greg Warda82122b2000-02-17 23:56:15 +0000468
Greg Wardd87eb732000-06-01 01:10:56 +0000469 def get_archive_files (self):
470 """Return the list of archive files created when the command
471 was run, or None if the command hasn't run yet.
472 """
473 return self.archive_files
474
Greg Wardfcd974e2000-05-25 01:10:04 +0000475# class sdist