Replaced 'self.files' with 'self.filelist': now we carry around a FileList
instance instead of a list of filenames.  Simplifies the "sdist" command
only a bit, but should allow greater simplification of FileList.
diff --git a/Lib/distutils/command/sdist.py b/Lib/distutils/command/sdist.py
index 045054b..4c2acf6 100644
--- a/Lib/distutils/command/sdist.py
+++ b/Lib/distutils/command/sdist.py
@@ -128,8 +128,9 @@
 
     def run (self):
 
-        # 'files' is the list of files that will make up the manifest
-        self.files = []
+        # 'filelist' contains the list of files that will make up the
+        # manifest
+        self.filelist = FileList()
         
         # Ensure that all required meta-data is given; warn if not (but
         # don't die, it's not *that* serious!)
@@ -137,7 +138,7 @@
 
         # Do whatever it takes to get the list of files to process
         # (process the manifest template, read an existing manifest,
-        # whatever).  File list is put into 'self.files'.
+        # whatever).  File list is accumulated in 'self.filelist'.
         self.get_file_list ()
 
         # If user just wanted us to regenerate the manifest, stop now.
@@ -184,7 +185,7 @@
 
     def get_file_list (self):
         """Figure out the list of files to include in the source
-        distribution, and put it in 'self.files'.  This might involve
+        distribution, and put it in 'self.filelist'.  This might involve
         reading the manifest template (and writing the manifest), or just
         reading the manifest, or just using the default file set -- it all
         depends on the user's options and the state of the filesystem.
@@ -192,9 +193,9 @@
 
         # If we have a manifest template, see if it's newer than the
         # manifest; if so, we'll regenerate the manifest.
-        template_exists = os.path.isfile (self.template)
+        template_exists = os.path.isfile(self.template)
         if template_exists:
-            template_newer = newer (self.template, self.manifest)
+            template_newer = newer(self.template, self.manifest)
 
         # The contents of the manifest file almost certainly depend on the
         # setup script as well as the manifest template -- so if the setup
@@ -222,17 +223,17 @@
             self.force_manifest or self.manifest_only):
 
             if not template_exists:
-                self.warn (("manifest template '%s' does not exist " +
-                            "(using default file list)") %
-                           self.template)
+                self.warn(("manifest template '%s' does not exist " +
+                           "(using default file list)") %
+                          self.template)
 
             # Add default file set to 'files'
             if self.use_defaults:
-                self.add_defaults ()
+                self.add_defaults()
 
             # Read manifest template if it exists
             if template_exists:
-                self.read_template ()
+                self.read_template()
 
             # Prune away any directories that don't belong in the source
             # distribution
@@ -241,30 +242,24 @@
 
             # File list now complete -- sort it so that higher-level files
             # come first
-            sortable_files = map (os.path.split, self.files)
-            sortable_files.sort ()
-            self.files = []
-            for sort_tuple in sortable_files:
-                self.files.append (apply (os.path.join, sort_tuple))
+            self.filelist.sort()
 
             # Remove duplicates from the file list
-            for i in range (len(self.files)-1, 0, -1):
-                if self.files[i] == self.files[i-1]:
-                    del self.files[i]
+            self.filelist.remove_duplicates()
 
             # And write complete file list (including default file set) to
             # the manifest.
-            self.write_manifest ()
+            self.write_manifest()
 
         # Don't regenerate the manifest, just read it in.
         else:
-            self.read_manifest ()
+            self.read_manifest()
 
     # get_file_list ()
 
 
     def add_defaults (self):
-        """Add all the default files to self.files:
+        """Add all the default files to self.filelist:
           - README or README.txt
           - setup.py
           - test/test*.py
@@ -286,7 +281,7 @@
                 for fn in alts:
                     if os.path.exists (fn):
                         got_it = 1
-                        self.files.append (fn)
+                        self.filelist.append (fn)
                         break
 
                 if not got_it:
@@ -294,7 +289,7 @@
                                string.join (alts, ', '))
             else:
                 if os.path.exists (fn):
-                    self.files.append (fn)
+                    self.filelist.append (fn)
                 else:
                     self.warn ("standard file '%s' not found" % fn)
 
@@ -302,33 +297,31 @@
         for pattern in optional:
             files = filter (os.path.isfile, glob (pattern))
             if files:
-                self.files.extend (files)
+                self.filelist.extend (files)
 
         if self.distribution.has_pure_modules():
             build_py = self.get_finalized_command ('build_py')
-            self.files.extend (build_py.get_source_files ())
+            self.filelist.extend (build_py.get_source_files ())
 
         if self.distribution.has_ext_modules():
             build_ext = self.get_finalized_command ('build_ext')
-            self.files.extend (build_ext.get_source_files ())
+            self.filelist.extend (build_ext.get_source_files ())
 
         if self.distribution.has_c_libraries():
             build_clib = self.get_finalized_command ('build_clib')
-            self.files.extend (build_clib.get_source_files ())
+            self.filelist.extend (build_clib.get_source_files ())
 
     # add_defaults ()
     
 
     def read_template (self):
-        """Read and parse the manifest template file named by
-        'self.template' (usually "MANIFEST.in").  Process all file
-        specifications (include and exclude) in the manifest template and
-        update 'self.files' accordingly (filenames may be added to
-        or removed from 'self.files' based on the manifest template).
-        """
-        assert self.files is not None and type (self.files) is ListType
-        self.announce("reading manifest template '%s'" % self.template)
 
+        """Read and parse the manifest template file named by
+        'self.template' (usually "MANIFEST.in").  The parsing and
+        processing is done by 'self.filelist', which updates itself
+        accordingly.
+        """
+        self.announce("reading manifest template '%s'" % self.template)
         template = TextFile (self.template,
                              strip_comments=1,
                              skip_blanks=1,
@@ -337,17 +330,12 @@
                              rstrip_ws=1,
                              collapse_ws=1)
 
-        # if we give Template() a list, it modifies this list
-        filelist = FileList(files=self.files,
-                            warn=self.warn,
-                            debug_print=self.debug_print)
-
         while 1:
             line = template.readline()
             if line is None:            # end of file
                 break
 
-            filelist.process_template_line(line)
+            self.filelist.process_template_line(line)
 
     # read_template ()
 
@@ -363,22 +351,18 @@
         build = self.get_finalized_command('build')
         base_dir = self.distribution.get_fullname()
 
-        # if we give FileList a list, it modifies this list
-        filelist = FileList(files=self.files,
-                            warn=self.warn,
-                            debug_print=self.debug_print)
-        filelist.exclude_pattern(None, prefix=build.build_base)
-        filelist.exclude_pattern(None, prefix=base_dir)
-        filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1)
+        self.filelist.exclude_pattern(None, prefix=build.build_base)
+        self.filelist.exclude_pattern(None, prefix=base_dir)
+        self.filelist.exclude_pattern(r'/(RCS|CVS)/.*', is_regex=1)
 
 
     def write_manifest (self):
-        """Write the file list in 'self.files' (presumably as filled in by
-        'add_defaults()' and 'read_template()') to the manifest file named
-        by 'self.manifest'.
+        """Write the file list in 'self.filelist' (presumably as filled in
+        by 'add_defaults()' and 'read_template()') to the manifest file
+        named by 'self.manifest'.
         """
         self.execute(write_file,
-                     (self.manifest, self.files),
+                     (self.manifest, self.filelist.files),
                      "writing manifest file '%s'" % self.manifest)
 
     # write_manifest ()
@@ -386,7 +370,7 @@
 
     def read_manifest (self):
         """Read the manifest file (named by 'self.manifest') and use it to
-        fill in 'self.files', the list of files to include in the source
+        fill in 'self.filelist', the list of files to include in the source
         distribution.
         """
         self.announce("reading manifest file '%s'" % self.manifest)
@@ -397,7 +381,7 @@
                 break
             if line[-1] == '\n':
                 line = line[0:-1]
-            self.files.append (line)
+            self.filelist.append (line)
 
     # read_manifest ()
             
@@ -451,7 +435,7 @@
         base_dir = self.distribution.get_fullname()
         base_name = os.path.join(self.dist_dir, base_dir)
 
-        self.make_release_tree (base_dir, self.files)
+        self.make_release_tree (base_dir, self.filelist.files)
         archive_files = []              # remember names of files we create
         if self.dist_dir:
             self.mkpath(self.dist_dir)