blob: 5116868e76bb11ef87f5ce3f9bd3555ea3bc264c [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
34
Greg Ward1993f9a2000-02-18 00:13:53 +000035class sdist (Command):
Greg Warda82122b2000-02-17 23:56:15 +000036
37 description = "create a source distribution (tarball, zip file, etc.)"
38
Greg Wardbbeceea2000-02-18 00:25:39 +000039 user_options = [
40 ('template=', 't',
41 "name of manifest template file [default: MANIFEST.in]"),
42 ('manifest=', 'm',
43 "name of manifest file [default: MANIFEST]"),
44 ('use-defaults', None,
45 "include the default file set in the manifest "
46 "[default; disable with --no-defaults]"),
Greg Ward499822d2000-06-29 02:06:29 +000047 ('no-defaults', None,
48 "don't include the default file set"),
49 ('prune', None,
50 "specifically exclude files/directories that should not be "
51 "distributed (build tree, RCS/CVS dirs, etc.) "
52 "[default; disable with --no-prune]"),
53 ('no-prune', None,
54 "don't automatically exclude anything"),
Greg Ward839d5322000-04-26 01:14:33 +000055 ('manifest-only', 'o',
Greg Wardc3c8c6e2000-06-08 00:46:45 +000056 "just regenerate the manifest and then stop "
57 "(implies --force-manifest)"),
Greg Ward839d5322000-04-26 01:14:33 +000058 ('force-manifest', 'f',
Greg Wardbbeceea2000-02-18 00:25:39 +000059 "forcibly regenerate the manifest and carry on as usual"),
Greg Wardbbeceea2000-02-18 00:25:39 +000060 ('formats=', None,
Greg Ward2ff78872000-06-24 00:23:20 +000061 "formats for source distribution (comma-separated list)"),
Greg Wardaf64aed2000-09-25 01:51:01 +000062 ('keep-temp', 'k',
Greg Wardbbeceea2000-02-18 00:25:39 +000063 "keep the distribution tree around after creating " +
64 "archive file(s)"),
Greg Wardc0614102000-07-05 03:06:46 +000065 ('dist-dir=', 'd',
66 "directory to put the source distribution archive(s) in "
67 "[default: dist]"),
Greg Wardbbeceea2000-02-18 00:25:39 +000068 ]
Greg Wardf1fe1032000-06-08 00:14:18 +000069
Greg Ward99b032e2000-09-25 01:41:15 +000070 boolean_options = ['use-defaults', 'prune',
71 'manifest-only', 'force-manifest',
Greg Wardaf64aed2000-09-25 01:51:01 +000072 'keep-temp']
Greg Wardf1fe1032000-06-08 00:14:18 +000073
Greg Ward9d17a7a2000-06-07 03:00:06 +000074 help_options = [
75 ('help-formats', None,
Greg Ward2ff78872000-06-24 00:23:20 +000076 "list available distribution formats", show_formats),
Greg Ward9d17a7a2000-06-07 03:00:06 +000077 ]
78
Greg Ward499822d2000-06-29 02:06:29 +000079 negative_opt = {'no-defaults': 'use-defaults',
80 'no-prune': 'prune' }
Greg Warda82122b2000-02-17 23:56:15 +000081
82 default_format = { 'posix': 'gztar',
83 'nt': 'zip' }
84
Greg Warde01149c2000-02-18 00:35:22 +000085 def initialize_options (self):
Greg Warda82122b2000-02-17 23:56:15 +000086 # 'template' and 'manifest' are, respectively, the names of
87 # the manifest template and manifest file.
88 self.template = None
89 self.manifest = None
90
91 # 'use_defaults': if true, we will include the default file set
92 # in the manifest
93 self.use_defaults = 1
Greg Ward499822d2000-06-29 02:06:29 +000094 self.prune = 1
Greg Warda82122b2000-02-17 23:56:15 +000095
96 self.manifest_only = 0
97 self.force_manifest = 0
98
99 self.formats = None
Greg Wardaf64aed2000-09-25 01:51:01 +0000100 self.keep_temp = 0
Greg Wardc0614102000-07-05 03:06:46 +0000101 self.dist_dir = None
Greg Warda82122b2000-02-17 23:56:15 +0000102
Greg Wardd87eb732000-06-01 01:10:56 +0000103 self.archive_files = None
104
Greg Warda82122b2000-02-17 23:56:15 +0000105
Greg Warde01149c2000-02-18 00:35:22 +0000106 def finalize_options (self):
Greg Warda82122b2000-02-17 23:56:15 +0000107 if self.manifest is None:
108 self.manifest = "MANIFEST"
109 if self.template is None:
110 self.template = "MANIFEST.in"
111
Greg Ward62d5a572000-06-04 15:12:51 +0000112 self.ensure_string_list('formats')
Greg Warda82122b2000-02-17 23:56:15 +0000113 if self.formats is None:
114 try:
115 self.formats = [self.default_format[os.name]]
116 except KeyError:
117 raise DistutilsPlatformError, \
Greg Ward578c10d2000-03-31 02:50:04 +0000118 "don't know how to create source distributions " + \
119 "on platform %s" % os.name
Greg Warda82122b2000-02-17 23:56:15 +0000120
Greg Wardcb1f4c42000-09-30 18:27:54 +0000121 bad_format = archive_util.check_archive_formats(self.formats)
Greg Ward6a9a5452000-04-22 03:11:55 +0000122 if bad_format:
123 raise DistutilsOptionError, \
124 "unknown archive format '%s'" % bad_format
125
Greg Wardc0614102000-07-05 03:06:46 +0000126 if self.dist_dir is None:
127 self.dist_dir = "dist"
128
Greg Warda82122b2000-02-17 23:56:15 +0000129
130 def run (self):
131
Greg Ward23266fe2000-07-30 01:30:31 +0000132 # 'filelist' contains the list of files that will make up the
133 # manifest
134 self.filelist = FileList()
Greg Warda82122b2000-02-17 23:56:15 +0000135
136 # Ensure that all required meta-data is given; warn if not (but
137 # don't die, it's not *that* serious!)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000138 self.check_metadata()
Greg Warda82122b2000-02-17 23:56:15 +0000139
140 # Do whatever it takes to get the list of files to process
141 # (process the manifest template, read an existing manifest,
Greg Ward23266fe2000-07-30 01:30:31 +0000142 # whatever). File list is accumulated in 'self.filelist'.
Greg Wardcb1f4c42000-09-30 18:27:54 +0000143 self.get_file_list()
Greg Warda82122b2000-02-17 23:56:15 +0000144
145 # If user just wanted us to regenerate the manifest, stop now.
146 if self.manifest_only:
147 return
148
149 # Otherwise, go ahead and create the source distribution tarball,
150 # or zipfile, or whatever.
Greg Wardcb1f4c42000-09-30 18:27:54 +0000151 self.make_distribution()
Greg Warda82122b2000-02-17 23:56:15 +0000152
153
154 def check_metadata (self):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000155 """Ensure that all required elements of meta-data (name, version,
156 URL, (author and author_email) or (maintainer and
157 maintainer_email)) are supplied by the Distribution object; warn if
158 any are missing.
159 """
Greg Ward535f2d92000-04-21 04:37:12 +0000160 metadata = self.distribution.metadata
Greg Warda82122b2000-02-17 23:56:15 +0000161
162 missing = []
163 for attr in ('name', 'version', 'url'):
Greg Wardcb1f4c42000-09-30 18:27:54 +0000164 if not (hasattr(metadata, attr) and getattr(metadata, attr)):
165 missing.append(attr)
Greg Warda82122b2000-02-17 23:56:15 +0000166
167 if missing:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000168 self.warn("missing required meta-data: " +
169 string.join(missing, ", "))
Greg Warda82122b2000-02-17 23:56:15 +0000170
Greg Ward535f2d92000-04-21 04:37:12 +0000171 if metadata.author:
172 if not metadata.author_email:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000173 self.warn("missing meta-data: if 'author' supplied, " +
174 "'author_email' must be supplied too")
Greg Ward535f2d92000-04-21 04:37:12 +0000175 elif metadata.maintainer:
176 if not metadata.maintainer_email:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000177 self.warn("missing meta-data: if 'maintainer' supplied, " +
178 "'maintainer_email' must be supplied too")
Greg Warda82122b2000-02-17 23:56:15 +0000179 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000180 self.warn("missing meta-data: either (author and author_email) " +
181 "or (maintainer and maintainer_email) " +
182 "must be supplied")
Greg Warda82122b2000-02-17 23:56:15 +0000183
184 # check_metadata ()
185
186
187 def get_file_list (self):
188 """Figure out the list of files to include in the source
Greg Ward23266fe2000-07-30 01:30:31 +0000189 distribution, and put it in 'self.filelist'. This might involve
Greg Warde0c8c2f2000-06-08 00:24:01 +0000190 reading the manifest template (and writing the manifest), or just
191 reading the manifest, or just using the default file set -- it all
192 depends on the user's options and the state of the filesystem.
193 """
Greg Wardb2db0eb2000-06-21 03:29:57 +0000194
195 # If we have a manifest template, see if it's newer than the
196 # manifest; if so, we'll regenerate the manifest.
Greg Ward23266fe2000-07-30 01:30:31 +0000197 template_exists = os.path.isfile(self.template)
Greg Warda82122b2000-02-17 23:56:15 +0000198 if template_exists:
Greg Wardab3a0f32000-08-05 01:31:54 +0000199 template_newer = dep_util.newer(self.template, self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000200
Greg Wardb2db0eb2000-06-21 03:29:57 +0000201 # The contents of the manifest file almost certainly depend on the
202 # setup script as well as the manifest template -- so if the setup
203 # script is newer than the manifest, we'll regenerate the manifest
204 # from the template. (Well, not quite: if we already have a
205 # manifest, but there's no template -- which will happen if the
206 # developer elects to generate a manifest some other way -- then we
207 # can't regenerate the manifest, so we don't.)
Greg Ward9821bf42000-08-29 01:15:18 +0000208 self.debug_print("checking if %s newer than %s" %
209 (self.distribution.script_name, self.manifest))
210 setup_newer = dep_util.newer(self.distribution.script_name,
211 self.manifest)
Greg Wardb2db0eb2000-06-21 03:29:57 +0000212
213 # cases:
214 # 1) no manifest, template exists: generate manifest
215 # (covered by 2a: no manifest == template newer)
216 # 2) manifest & template exist:
217 # 2a) template or setup script newer than manifest:
218 # regenerate manifest
219 # 2b) manifest newer than both:
220 # do nothing (unless --force or --manifest-only)
221 # 3) manifest exists, no template:
222 # do nothing (unless --force or --manifest-only)
223 # 4) no manifest, no template: generate w/ warning ("defaults only")
224
Greg Wardd3b76a82000-09-06 02:08:24 +0000225 manifest_outofdate = (template_exists and
226 (template_newer or setup_newer))
227 force_regen = self.force_manifest or self.manifest_only
228 manifest_exists = os.path.isfile(self.manifest)
229 neither_exists = (not template_exists and not manifest_exists)
Greg Warda82122b2000-02-17 23:56:15 +0000230
Greg Wardd3b76a82000-09-06 02:08:24 +0000231 # Regenerate the manifest if necessary (or if explicitly told to)
232 if manifest_outofdate or neither_exists or force_regen:
Greg Warda82122b2000-02-17 23:56:15 +0000233 if not template_exists:
Greg Ward23266fe2000-07-30 01:30:31 +0000234 self.warn(("manifest template '%s' does not exist " +
235 "(using default file list)") %
236 self.template)
Greg Warda82122b2000-02-17 23:56:15 +0000237
Greg Ward6b24dff2000-07-30 01:47:16 +0000238 self.filelist.findall()
239
Greg Warda82122b2000-02-17 23:56:15 +0000240 # Add default file set to 'files'
241 if self.use_defaults:
Greg Ward23266fe2000-07-30 01:30:31 +0000242 self.add_defaults()
Greg Warda82122b2000-02-17 23:56:15 +0000243
244 # Read manifest template if it exists
245 if template_exists:
Greg Ward23266fe2000-07-30 01:30:31 +0000246 self.read_template()
Greg Warda82122b2000-02-17 23:56:15 +0000247
Greg Ward499822d2000-06-29 02:06:29 +0000248 # Prune away any directories that don't belong in the source
249 # distribution
250 if self.prune:
251 self.prune_file_list()
Greg Wardce15c6c2000-06-08 01:06:02 +0000252
Greg Warda82122b2000-02-17 23:56:15 +0000253 # File list now complete -- sort it so that higher-level files
254 # come first
Greg Ward23266fe2000-07-30 01:30:31 +0000255 self.filelist.sort()
Greg Warda82122b2000-02-17 23:56:15 +0000256
257 # Remove duplicates from the file list
Greg Ward23266fe2000-07-30 01:30:31 +0000258 self.filelist.remove_duplicates()
Greg Warda82122b2000-02-17 23:56:15 +0000259
260 # And write complete file list (including default file set) to
261 # the manifest.
Greg Ward23266fe2000-07-30 01:30:31 +0000262 self.write_manifest()
Greg Warda82122b2000-02-17 23:56:15 +0000263
264 # Don't regenerate the manifest, just read it in.
265 else:
Greg Ward23266fe2000-07-30 01:30:31 +0000266 self.read_manifest()
Greg Warda82122b2000-02-17 23:56:15 +0000267
268 # get_file_list ()
269
270
Greg Ward4a7319c2000-06-08 00:52:52 +0000271 def add_defaults (self):
Greg Ward23266fe2000-07-30 01:30:31 +0000272 """Add all the default files to self.filelist:
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000273 - README or README.txt
274 - setup.py
275 - test/test*.py
276 - all pure Python modules mentioned in setup script
277 - all C sources listed as part of extensions or C libraries
278 in the setup script (doesn't catch C headers!)
279 Warns if (README or README.txt) or setup.py are missing; everything
280 else is optional.
281 """
Greg Ward14c8d052000-06-08 01:22:48 +0000282
Greg Wardd3b76a82000-09-06 02:08:24 +0000283 standards = [('README', 'README.txt'), self.distribution.script_name]
Greg Warda82122b2000-02-17 23:56:15 +0000284 for fn in standards:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000285 if type(fn) is TupleType:
Greg Warda82122b2000-02-17 23:56:15 +0000286 alts = fn
Greg Ward48401122000-02-24 03:17:43 +0000287 got_it = 0
Greg Warda82122b2000-02-17 23:56:15 +0000288 for fn in alts:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000289 if os.path.exists(fn):
Greg Warda82122b2000-02-17 23:56:15 +0000290 got_it = 1
Greg Wardcb1f4c42000-09-30 18:27:54 +0000291 self.filelist.append(fn)
Greg Warda82122b2000-02-17 23:56:15 +0000292 break
293
294 if not got_it:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000295 self.warn("standard file not found: should have one of " +
296 string.join(alts, ', '))
Greg Warda82122b2000-02-17 23:56:15 +0000297 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000298 if os.path.exists(fn):
299 self.filelist.append(fn)
Greg Warda82122b2000-02-17 23:56:15 +0000300 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000301 self.warn("standard file '%s' not found" % fn)
Greg Warda82122b2000-02-17 23:56:15 +0000302
Greg Ward14c8d052000-06-08 01:22:48 +0000303 optional = ['test/test*.py', 'setup.cfg']
Greg Warda82122b2000-02-17 23:56:15 +0000304 for pattern in optional:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000305 files = filter(os.path.isfile, glob(pattern))
Greg Warda82122b2000-02-17 23:56:15 +0000306 if files:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000307 self.filelist.extend(files)
Greg Warda82122b2000-02-17 23:56:15 +0000308
Greg Ward578c10d2000-03-31 02:50:04 +0000309 if self.distribution.has_pure_modules():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000310 build_py = self.get_finalized_command('build_py')
311 self.filelist.extend(build_py.get_source_files())
Greg Warda82122b2000-02-17 23:56:15 +0000312
Greg Ward578c10d2000-03-31 02:50:04 +0000313 if self.distribution.has_ext_modules():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000314 build_ext = self.get_finalized_command('build_ext')
315 self.filelist.extend(build_ext.get_source_files())
Greg Warda82122b2000-02-17 23:56:15 +0000316
Greg Ward60908f12000-04-09 03:51:40 +0000317 if self.distribution.has_c_libraries():
Greg Wardcb1f4c42000-09-30 18:27:54 +0000318 build_clib = self.get_finalized_command('build_clib')
319 self.filelist.extend(build_clib.get_source_files())
Greg Ward60908f12000-04-09 03:51:40 +0000320
Greg Ward4a7319c2000-06-08 00:52:52 +0000321 # add_defaults ()
322
Greg Warda82122b2000-02-17 23:56:15 +0000323
Greg Warda82122b2000-02-17 23:56:15 +0000324 def read_template (self):
Greg Warda82122b2000-02-17 23:56:15 +0000325
Greg Ward23266fe2000-07-30 01:30:31 +0000326 """Read and parse the manifest template file named by
327 'self.template' (usually "MANIFEST.in"). The parsing and
328 processing is done by 'self.filelist', which updates itself
329 accordingly.
330 """
331 self.announce("reading manifest template '%s'" % self.template)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000332 template = TextFile(self.template,
333 strip_comments=1,
334 skip_blanks=1,
335 join_lines=1,
336 lstrip_ws=1,
337 rstrip_ws=1,
338 collapse_join=1)
Greg Warda82122b2000-02-17 23:56:15 +0000339
Greg Warda82122b2000-02-17 23:56:15 +0000340 while 1:
Greg Warda82122b2000-02-17 23:56:15 +0000341 line = template.readline()
342 if line is None: # end of file
343 break
344
Greg Ward6b24dff2000-07-30 01:47:16 +0000345 try:
346 self.filelist.process_template_line(line)
347 except DistutilsTemplateError, msg:
348 self.warn("%s, line %d: %s" % (template.filename,
349 template.current_line,
350 msg))
Greg Warda82122b2000-02-17 23:56:15 +0000351
352 # read_template ()
353
354
Greg Wardce15c6c2000-06-08 01:06:02 +0000355 def prune_file_list (self):
356 """Prune off branches that might slip into the file list as created
Greg Ward499822d2000-06-29 02:06:29 +0000357 by 'read_template()', but really don't belong there:
358 * the build tree (typically "build")
359 * the release tree itself (only an issue if we ran "sdist"
Greg Wardaf64aed2000-09-25 01:51:01 +0000360 previously with --keep-temp, or it aborted)
Greg Ward499822d2000-06-29 02:06:29 +0000361 * any RCS or CVS directories
Greg Wardce15c6c2000-06-08 01:06:02 +0000362 """
363 build = self.get_finalized_command('build')
364 base_dir = self.distribution.get_fullname()
Greg Wardce15c6c2000-06-08 01:06:02 +0000365
Greg Ward23266fe2000-07-30 01:30:31 +0000366 self.filelist.exclude_pattern(None, prefix=build.build_base)
367 self.filelist.exclude_pattern(None, prefix=base_dir)
368 self.filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1)
Greg Wardf8b9e202000-06-08 00:08:14 +0000369
370
Greg Warda82122b2000-02-17 23:56:15 +0000371 def write_manifest (self):
Greg Ward23266fe2000-07-30 01:30:31 +0000372 """Write the file list in 'self.filelist' (presumably as filled in
373 by 'add_defaults()' and 'read_template()') to the manifest file
374 named by 'self.manifest'.
Greg Warde0c8c2f2000-06-08 00:24:01 +0000375 """
Greg Wardab3a0f32000-08-05 01:31:54 +0000376 self.execute(file_util.write_file,
Greg Ward23266fe2000-07-30 01:30:31 +0000377 (self.manifest, self.filelist.files),
Greg Wardf8b9e202000-06-08 00:08:14 +0000378 "writing manifest file '%s'" % self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000379
380 # write_manifest ()
381
382
383 def read_manifest (self):
Greg Warde0c8c2f2000-06-08 00:24:01 +0000384 """Read the manifest file (named by 'self.manifest') and use it to
Greg Ward23266fe2000-07-30 01:30:31 +0000385 fill in 'self.filelist', the list of files to include in the source
Greg Warde0c8c2f2000-06-08 00:24:01 +0000386 distribution.
387 """
Greg Wardf8b9e202000-06-08 00:08:14 +0000388 self.announce("reading manifest file '%s'" % self.manifest)
Greg Wardcb1f4c42000-09-30 18:27:54 +0000389 manifest = open(self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000390 while 1:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000391 line = manifest.readline()
Greg Warda82122b2000-02-17 23:56:15 +0000392 if line == '': # end of file
393 break
394 if line[-1] == '\n':
395 line = line[0:-1]
Greg Wardcb1f4c42000-09-30 18:27:54 +0000396 self.filelist.append(line)
Greg Warda82122b2000-02-17 23:56:15 +0000397
398 # read_manifest ()
399
400
Greg Warda82122b2000-02-17 23:56:15 +0000401 def make_release_tree (self, base_dir, files):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000402 """Create the directory tree that will become the source
403 distribution archive. All directories implied by the filenames in
404 'files' are created under 'base_dir', and then we hard link or copy
405 (if hard linking is unavailable) those files into place.
406 Essentially, this duplicates the developer's source tree, but in a
407 directory named after the distribution, containing only the files
408 to be distributed.
409 """
Greg Ward578c10d2000-03-31 02:50:04 +0000410 # Create all the directories under 'base_dir' necessary to
Greg Ward5fad2682000-09-06 02:18:59 +0000411 # put 'files' there; the 'mkpath()' is just so we don't die
412 # if the manifest happens to be empty.
413 self.mkpath(base_dir)
414 dir_util.create_tree(base_dir, files,
415 verbose=self.verbose, dry_run=self.dry_run)
Greg Warda82122b2000-02-17 23:56:15 +0000416
417 # And walk over the list of files, either making a hard link (if
418 # os.link exists) to each one that doesn't already exist in its
419 # corresponding location under 'base_dir', or copying each file
420 # that's out-of-date in 'base_dir'. (Usually, all files will be
421 # out-of-date, because by default we blow away 'base_dir' when
422 # we're done making the distribution archives.)
423
Greg Wardcb1f4c42000-09-30 18:27:54 +0000424 if hasattr(os, 'link'): # can make hard links on this system
Greg Ward578c10d2000-03-31 02:50:04 +0000425 link = 'hard'
Greg Warda82122b2000-02-17 23:56:15 +0000426 msg = "making hard links in %s..." % base_dir
Greg Ward578c10d2000-03-31 02:50:04 +0000427 else: # nope, have to copy
428 link = None
Greg Warda82122b2000-02-17 23:56:15 +0000429 msg = "copying files to %s..." % base_dir
430
Greg Ward5fad2682000-09-06 02:18:59 +0000431 if not files:
432 self.warn("no files to distribute -- empty manifest?")
433 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000434 self.announce(msg)
Greg Warda82122b2000-02-17 23:56:15 +0000435 for file in files:
Greg Ward5fad2682000-09-06 02:18:59 +0000436 if not os.path.isfile(file):
437 self.warn("'%s' not a regular file -- skipping" % file)
438 else:
Greg Wardcb1f4c42000-09-30 18:27:54 +0000439 dest = os.path.join(base_dir, file)
440 self.copy_file(file, dest, link=link)
Greg Warda82122b2000-02-17 23:56:15 +0000441
442 # make_release_tree ()
443
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