blob: 1bf297fdcb3c0f4a186481debdcbee3358627e2c [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 Wardbbeceea2000-02-18 00:25:39 +000062 ('keep-tree', 'k',
63 "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
70
Greg Ward9d17a7a2000-06-07 03:00:06 +000071 help_options = [
72 ('help-formats', None,
Greg Ward2ff78872000-06-24 00:23:20 +000073 "list available distribution formats", show_formats),
Greg Ward9d17a7a2000-06-07 03:00:06 +000074 ]
75
Greg Ward499822d2000-06-29 02:06:29 +000076 negative_opt = {'no-defaults': 'use-defaults',
77 'no-prune': 'prune' }
Greg Warda82122b2000-02-17 23:56:15 +000078
79 default_format = { 'posix': 'gztar',
80 'nt': 'zip' }
81
Greg Warde01149c2000-02-18 00:35:22 +000082 def initialize_options (self):
Greg Warda82122b2000-02-17 23:56:15 +000083 # 'template' and 'manifest' are, respectively, the names of
84 # the manifest template and manifest file.
85 self.template = None
86 self.manifest = None
87
88 # 'use_defaults': if true, we will include the default file set
89 # in the manifest
90 self.use_defaults = 1
Greg Ward499822d2000-06-29 02:06:29 +000091 self.prune = 1
Greg Warda82122b2000-02-17 23:56:15 +000092
93 self.manifest_only = 0
94 self.force_manifest = 0
95
96 self.formats = None
Greg Warda82122b2000-02-17 23:56:15 +000097 self.keep_tree = 0
Greg Wardc0614102000-07-05 03:06:46 +000098 self.dist_dir = None
Greg Warda82122b2000-02-17 23:56:15 +000099
Greg Wardd87eb732000-06-01 01:10:56 +0000100 self.archive_files = None
101
Greg Warda82122b2000-02-17 23:56:15 +0000102
Greg Warde01149c2000-02-18 00:35:22 +0000103 def finalize_options (self):
Greg Warda82122b2000-02-17 23:56:15 +0000104 if self.manifest is None:
105 self.manifest = "MANIFEST"
106 if self.template is None:
107 self.template = "MANIFEST.in"
108
Greg Ward62d5a572000-06-04 15:12:51 +0000109 self.ensure_string_list('formats')
Greg Warda82122b2000-02-17 23:56:15 +0000110 if self.formats is None:
111 try:
112 self.formats = [self.default_format[os.name]]
113 except KeyError:
114 raise DistutilsPlatformError, \
Greg Ward578c10d2000-03-31 02:50:04 +0000115 "don't know how to create source distributions " + \
116 "on platform %s" % os.name
Greg Warda82122b2000-02-17 23:56:15 +0000117
Greg Wardab3a0f32000-08-05 01:31:54 +0000118 bad_format = archive_util.check_archive_formats (self.formats)
Greg Ward6a9a5452000-04-22 03:11:55 +0000119 if bad_format:
120 raise DistutilsOptionError, \
121 "unknown archive format '%s'" % bad_format
122
Greg Wardc0614102000-07-05 03:06:46 +0000123 if self.dist_dir is None:
124 self.dist_dir = "dist"
125
Greg Warda82122b2000-02-17 23:56:15 +0000126
127 def run (self):
128
Greg Ward23266fe2000-07-30 01:30:31 +0000129 # 'filelist' contains the list of files that will make up the
130 # manifest
131 self.filelist = FileList()
Greg Warda82122b2000-02-17 23:56:15 +0000132
133 # Ensure that all required meta-data is given; warn if not (but
134 # don't die, it's not *that* serious!)
135 self.check_metadata ()
136
137 # Do whatever it takes to get the list of files to process
138 # (process the manifest template, read an existing manifest,
Greg Ward23266fe2000-07-30 01:30:31 +0000139 # whatever). File list is accumulated in 'self.filelist'.
Greg Warda82122b2000-02-17 23:56:15 +0000140 self.get_file_list ()
141
142 # If user just wanted us to regenerate the manifest, stop now.
143 if self.manifest_only:
144 return
145
146 # Otherwise, go ahead and create the source distribution tarball,
147 # or zipfile, or whatever.
148 self.make_distribution ()
149
150
151 def check_metadata (self):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000152 """Ensure that all required elements of meta-data (name, version,
153 URL, (author and author_email) or (maintainer and
154 maintainer_email)) are supplied by the Distribution object; warn if
155 any are missing.
156 """
Greg Ward535f2d92000-04-21 04:37:12 +0000157 metadata = self.distribution.metadata
Greg Warda82122b2000-02-17 23:56:15 +0000158
159 missing = []
160 for attr in ('name', 'version', 'url'):
Greg Ward535f2d92000-04-21 04:37:12 +0000161 if not (hasattr (metadata, attr) and getattr (metadata, attr)):
Greg Warda82122b2000-02-17 23:56:15 +0000162 missing.append (attr)
163
164 if missing:
165 self.warn ("missing required meta-data: " +
166 string.join (missing, ", "))
167
Greg Ward535f2d92000-04-21 04:37:12 +0000168 if metadata.author:
169 if not metadata.author_email:
Greg Warda82122b2000-02-17 23:56:15 +0000170 self.warn ("missing meta-data: if 'author' supplied, " +
171 "'author_email' must be supplied too")
Greg Ward535f2d92000-04-21 04:37:12 +0000172 elif metadata.maintainer:
173 if not metadata.maintainer_email:
Greg Warda82122b2000-02-17 23:56:15 +0000174 self.warn ("missing meta-data: if 'maintainer' supplied, " +
175 "'maintainer_email' must be supplied too")
176 else:
177 self.warn ("missing meta-data: either (author and author_email) " +
178 "or (maintainer and maintainer_email) " +
179 "must be supplied")
180
181 # check_metadata ()
182
183
184 def get_file_list (self):
185 """Figure out the list of files to include in the source
Greg Ward23266fe2000-07-30 01:30:31 +0000186 distribution, and put it in 'self.filelist'. This might involve
Greg Warde0c8c2f2000-06-08 00:24:01 +0000187 reading the manifest template (and writing the manifest), or just
188 reading the manifest, or just using the default file set -- it all
189 depends on the user's options and the state of the filesystem.
190 """
Greg Wardb2db0eb2000-06-21 03:29:57 +0000191
192 # If we have a manifest template, see if it's newer than the
193 # manifest; if so, we'll regenerate the manifest.
Greg Ward23266fe2000-07-30 01:30:31 +0000194 template_exists = os.path.isfile(self.template)
Greg Warda82122b2000-02-17 23:56:15 +0000195 if template_exists:
Greg Wardab3a0f32000-08-05 01:31:54 +0000196 template_newer = dep_util.newer(self.template, self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000197
Greg Wardb2db0eb2000-06-21 03:29:57 +0000198 # The contents of the manifest file almost certainly depend on the
199 # setup script as well as the manifest template -- so if the setup
200 # script is newer than the manifest, we'll regenerate the manifest
201 # from the template. (Well, not quite: if we already have a
202 # manifest, but there's no template -- which will happen if the
203 # developer elects to generate a manifest some other way -- then we
204 # can't regenerate the manifest, so we don't.)
Greg Ward9821bf42000-08-29 01:15:18 +0000205 self.debug_print("checking if %s newer than %s" %
206 (self.distribution.script_name, self.manifest))
207 setup_newer = dep_util.newer(self.distribution.script_name,
208 self.manifest)
Greg Wardb2db0eb2000-06-21 03:29:57 +0000209
210 # cases:
211 # 1) no manifest, template exists: generate manifest
212 # (covered by 2a: no manifest == template newer)
213 # 2) manifest & template exist:
214 # 2a) template or setup script newer than manifest:
215 # regenerate manifest
216 # 2b) manifest newer than both:
217 # do nothing (unless --force or --manifest-only)
218 # 3) manifest exists, no template:
219 # do nothing (unless --force or --manifest-only)
220 # 4) no manifest, no template: generate w/ warning ("defaults only")
221
Greg Wardd3b76a82000-09-06 02:08:24 +0000222 manifest_outofdate = (template_exists and
223 (template_newer or setup_newer))
224 force_regen = self.force_manifest or self.manifest_only
225 manifest_exists = os.path.isfile(self.manifest)
226 neither_exists = (not template_exists and not manifest_exists)
Greg Warda82122b2000-02-17 23:56:15 +0000227
Greg Wardd3b76a82000-09-06 02:08:24 +0000228 # Regenerate the manifest if necessary (or if explicitly told to)
229 if manifest_outofdate or neither_exists or force_regen:
Greg Warda82122b2000-02-17 23:56:15 +0000230 if not template_exists:
Greg Ward23266fe2000-07-30 01:30:31 +0000231 self.warn(("manifest template '%s' does not exist " +
232 "(using default file list)") %
233 self.template)
Greg Warda82122b2000-02-17 23:56:15 +0000234
Greg Ward6b24dff2000-07-30 01:47:16 +0000235 self.filelist.findall()
236
Greg Warda82122b2000-02-17 23:56:15 +0000237 # Add default file set to 'files'
238 if self.use_defaults:
Greg Ward23266fe2000-07-30 01:30:31 +0000239 self.add_defaults()
Greg Warda82122b2000-02-17 23:56:15 +0000240
241 # Read manifest template if it exists
242 if template_exists:
Greg Ward23266fe2000-07-30 01:30:31 +0000243 self.read_template()
Greg Warda82122b2000-02-17 23:56:15 +0000244
Greg Ward499822d2000-06-29 02:06:29 +0000245 # Prune away any directories that don't belong in the source
246 # distribution
247 if self.prune:
248 self.prune_file_list()
Greg Wardce15c6c2000-06-08 01:06:02 +0000249
Greg Warda82122b2000-02-17 23:56:15 +0000250 # File list now complete -- sort it so that higher-level files
251 # come first
Greg Ward23266fe2000-07-30 01:30:31 +0000252 self.filelist.sort()
Greg Warda82122b2000-02-17 23:56:15 +0000253
254 # Remove duplicates from the file list
Greg Ward23266fe2000-07-30 01:30:31 +0000255 self.filelist.remove_duplicates()
Greg Warda82122b2000-02-17 23:56:15 +0000256
257 # And write complete file list (including default file set) to
258 # the manifest.
Greg Ward23266fe2000-07-30 01:30:31 +0000259 self.write_manifest()
Greg Warda82122b2000-02-17 23:56:15 +0000260
261 # Don't regenerate the manifest, just read it in.
262 else:
Greg Ward23266fe2000-07-30 01:30:31 +0000263 self.read_manifest()
Greg Warda82122b2000-02-17 23:56:15 +0000264
265 # get_file_list ()
266
267
Greg Ward4a7319c2000-06-08 00:52:52 +0000268 def add_defaults (self):
Greg Ward23266fe2000-07-30 01:30:31 +0000269 """Add all the default files to self.filelist:
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000270 - README or README.txt
271 - setup.py
272 - test/test*.py
273 - all pure Python modules mentioned in setup script
274 - all C sources listed as part of extensions or C libraries
275 in the setup script (doesn't catch C headers!)
276 Warns if (README or README.txt) or setup.py are missing; everything
277 else is optional.
278 """
Greg Ward14c8d052000-06-08 01:22:48 +0000279
Greg Wardd3b76a82000-09-06 02:08:24 +0000280 standards = [('README', 'README.txt'), self.distribution.script_name]
Greg Warda82122b2000-02-17 23:56:15 +0000281 for fn in standards:
282 if type (fn) is TupleType:
283 alts = fn
Greg Ward48401122000-02-24 03:17:43 +0000284 got_it = 0
Greg Warda82122b2000-02-17 23:56:15 +0000285 for fn in alts:
286 if os.path.exists (fn):
287 got_it = 1
Greg Ward23266fe2000-07-30 01:30:31 +0000288 self.filelist.append (fn)
Greg Warda82122b2000-02-17 23:56:15 +0000289 break
290
291 if not got_it:
292 self.warn ("standard file not found: should have one of " +
293 string.join (alts, ', '))
294 else:
295 if os.path.exists (fn):
Greg Ward23266fe2000-07-30 01:30:31 +0000296 self.filelist.append (fn)
Greg Warda82122b2000-02-17 23:56:15 +0000297 else:
298 self.warn ("standard file '%s' not found" % fn)
299
Greg Ward14c8d052000-06-08 01:22:48 +0000300 optional = ['test/test*.py', 'setup.cfg']
Greg Warda82122b2000-02-17 23:56:15 +0000301 for pattern in optional:
302 files = filter (os.path.isfile, glob (pattern))
303 if files:
Greg Ward23266fe2000-07-30 01:30:31 +0000304 self.filelist.extend (files)
Greg Warda82122b2000-02-17 23:56:15 +0000305
Greg Ward578c10d2000-03-31 02:50:04 +0000306 if self.distribution.has_pure_modules():
Greg Ward4fb29e52000-05-27 17:27:23 +0000307 build_py = self.get_finalized_command ('build_py')
Greg Ward23266fe2000-07-30 01:30:31 +0000308 self.filelist.extend (build_py.get_source_files ())
Greg Warda82122b2000-02-17 23:56:15 +0000309
Greg Ward578c10d2000-03-31 02:50:04 +0000310 if self.distribution.has_ext_modules():
Greg Ward4fb29e52000-05-27 17:27:23 +0000311 build_ext = self.get_finalized_command ('build_ext')
Greg Ward23266fe2000-07-30 01:30:31 +0000312 self.filelist.extend (build_ext.get_source_files ())
Greg Warda82122b2000-02-17 23:56:15 +0000313
Greg Ward60908f12000-04-09 03:51:40 +0000314 if self.distribution.has_c_libraries():
Greg Ward4fb29e52000-05-27 17:27:23 +0000315 build_clib = self.get_finalized_command ('build_clib')
Greg Ward23266fe2000-07-30 01:30:31 +0000316 self.filelist.extend (build_clib.get_source_files ())
Greg Ward60908f12000-04-09 03:51:40 +0000317
Greg Ward4a7319c2000-06-08 00:52:52 +0000318 # add_defaults ()
319
Greg Warda82122b2000-02-17 23:56:15 +0000320
Greg Warda82122b2000-02-17 23:56:15 +0000321 def read_template (self):
Greg Warda82122b2000-02-17 23:56:15 +0000322
Greg Ward23266fe2000-07-30 01:30:31 +0000323 """Read and parse the manifest template file named by
324 'self.template' (usually "MANIFEST.in"). The parsing and
325 processing is done by 'self.filelist', which updates itself
326 accordingly.
327 """
328 self.announce("reading manifest template '%s'" % self.template)
Greg Warda82122b2000-02-17 23:56:15 +0000329 template = TextFile (self.template,
330 strip_comments=1,
331 skip_blanks=1,
332 join_lines=1,
333 lstrip_ws=1,
334 rstrip_ws=1,
335 collapse_ws=1)
336
Greg Warda82122b2000-02-17 23:56:15 +0000337 while 1:
Greg Warda82122b2000-02-17 23:56:15 +0000338 line = template.readline()
339 if line is None: # end of file
340 break
341
Greg Ward6b24dff2000-07-30 01:47:16 +0000342 try:
343 self.filelist.process_template_line(line)
344 except DistutilsTemplateError, msg:
345 self.warn("%s, line %d: %s" % (template.filename,
346 template.current_line,
347 msg))
Greg Warda82122b2000-02-17 23:56:15 +0000348
349 # read_template ()
350
351
Greg Wardce15c6c2000-06-08 01:06:02 +0000352 def prune_file_list (self):
353 """Prune off branches that might slip into the file list as created
Greg Ward499822d2000-06-29 02:06:29 +0000354 by 'read_template()', but really don't belong there:
355 * the build tree (typically "build")
356 * the release tree itself (only an issue if we ran "sdist"
357 previously with --keep-tree, or it aborted)
358 * any RCS or CVS directories
Greg Wardce15c6c2000-06-08 01:06:02 +0000359 """
360 build = self.get_finalized_command('build')
361 base_dir = self.distribution.get_fullname()
Greg Wardce15c6c2000-06-08 01:06:02 +0000362
Greg Ward23266fe2000-07-30 01:30:31 +0000363 self.filelist.exclude_pattern(None, prefix=build.build_base)
364 self.filelist.exclude_pattern(None, prefix=base_dir)
365 self.filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1)
Greg Wardf8b9e202000-06-08 00:08:14 +0000366
367
Greg Warda82122b2000-02-17 23:56:15 +0000368 def write_manifest (self):
Greg Ward23266fe2000-07-30 01:30:31 +0000369 """Write the file list in 'self.filelist' (presumably as filled in
370 by 'add_defaults()' and 'read_template()') to the manifest file
371 named by 'self.manifest'.
Greg Warde0c8c2f2000-06-08 00:24:01 +0000372 """
Greg Wardab3a0f32000-08-05 01:31:54 +0000373 self.execute(file_util.write_file,
Greg Ward23266fe2000-07-30 01:30:31 +0000374 (self.manifest, self.filelist.files),
Greg Wardf8b9e202000-06-08 00:08:14 +0000375 "writing manifest file '%s'" % self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000376
377 # write_manifest ()
378
379
380 def read_manifest (self):
Greg Warde0c8c2f2000-06-08 00:24:01 +0000381 """Read the manifest file (named by 'self.manifest') and use it to
Greg Ward23266fe2000-07-30 01:30:31 +0000382 fill in 'self.filelist', the list of files to include in the source
Greg Warde0c8c2f2000-06-08 00:24:01 +0000383 distribution.
384 """
Greg Wardf8b9e202000-06-08 00:08:14 +0000385 self.announce("reading manifest file '%s'" % self.manifest)
Greg Warda82122b2000-02-17 23:56:15 +0000386 manifest = open (self.manifest)
387 while 1:
388 line = manifest.readline ()
389 if line == '': # end of file
390 break
391 if line[-1] == '\n':
392 line = line[0:-1]
Greg Ward23266fe2000-07-30 01:30:31 +0000393 self.filelist.append (line)
Greg Warda82122b2000-02-17 23:56:15 +0000394
395 # read_manifest ()
396
397
Greg Warda82122b2000-02-17 23:56:15 +0000398 def make_release_tree (self, base_dir, files):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000399 """Create the directory tree that will become the source
400 distribution archive. All directories implied by the filenames in
401 'files' are created under 'base_dir', and then we hard link or copy
402 (if hard linking is unavailable) those files into place.
403 Essentially, this duplicates the developer's source tree, but in a
404 directory named after the distribution, containing only the files
405 to be distributed.
406 """
Greg Ward578c10d2000-03-31 02:50:04 +0000407 # Create all the directories under 'base_dir' necessary to
408 # put 'files' there.
Greg Wardab3a0f32000-08-05 01:31:54 +0000409 dir_util.create_tree (base_dir, files,
410 verbose=self.verbose, dry_run=self.dry_run)
Greg Warda82122b2000-02-17 23:56:15 +0000411
412 # And walk over the list of files, either making a hard link (if
413 # os.link exists) to each one that doesn't already exist in its
414 # corresponding location under 'base_dir', or copying each file
415 # that's out-of-date in 'base_dir'. (Usually, all files will be
416 # out-of-date, because by default we blow away 'base_dir' when
417 # we're done making the distribution archives.)
418
Greg Ward578c10d2000-03-31 02:50:04 +0000419 if hasattr (os, 'link'): # can make hard links on this system
420 link = 'hard'
Greg Warda82122b2000-02-17 23:56:15 +0000421 msg = "making hard links in %s..." % base_dir
Greg Ward578c10d2000-03-31 02:50:04 +0000422 else: # nope, have to copy
423 link = None
Greg Warda82122b2000-02-17 23:56:15 +0000424 msg = "copying files to %s..." % base_dir
425
426 self.announce (msg)
427 for file in files:
428 dest = os.path.join (base_dir, file)
Greg Ward578c10d2000-03-31 02:50:04 +0000429 self.copy_file (file, dest, link=link)
Greg Warda82122b2000-02-17 23:56:15 +0000430
431 # make_release_tree ()
432
433
Greg Warda82122b2000-02-17 23:56:15 +0000434 def make_distribution (self):
Greg Wardc3c8c6e2000-06-08 00:46:45 +0000435 """Create the source distribution(s). First, we create the release
436 tree with 'make_release_tree()'; then, we create all required
437 archive files (according to 'self.formats') from the release tree.
438 Finally, we clean up by blowing away the release tree (unless
439 'self.keep_tree' is true). The list of archive files created is
440 stored so it can be retrieved later by 'get_archive_files()'.
441 """
Greg Ward578c10d2000-03-31 02:50:04 +0000442 # Don't warn about missing meta-data here -- should be (and is!)
443 # done elsewhere.
Greg Ward0ae7f762000-04-22 02:51:25 +0000444 base_dir = self.distribution.get_fullname()
Greg Wardc0614102000-07-05 03:06:46 +0000445 base_name = os.path.join(self.dist_dir, base_dir)
Greg Warda82122b2000-02-17 23:56:15 +0000446
Greg Ward23266fe2000-07-30 01:30:31 +0000447 self.make_release_tree (base_dir, self.filelist.files)
Greg Wardd87eb732000-06-01 01:10:56 +0000448 archive_files = [] # remember names of files we create
Greg Warda82122b2000-02-17 23:56:15 +0000449 for fmt in self.formats:
Greg Wardc0614102000-07-05 03:06:46 +0000450 file = self.make_archive (base_name, fmt, base_dir=base_dir)
Greg Wardd87eb732000-06-01 01:10:56 +0000451 archive_files.append(file)
452
453 self.archive_files = archive_files
Greg Warda82122b2000-02-17 23:56:15 +0000454
455 if not self.keep_tree:
Greg Wardab3a0f32000-08-05 01:31:54 +0000456 dir_util.remove_tree (base_dir, self.verbose, self.dry_run)
Greg Warda82122b2000-02-17 23:56:15 +0000457
Greg Wardd87eb732000-06-01 01:10:56 +0000458 def get_archive_files (self):
459 """Return the list of archive files created when the command
460 was run, or None if the command hasn't run yet.
461 """
462 return self.archive_files
463
Greg Wardfcd974e2000-05-25 01:10:04 +0000464# class sdist