The 'copy_file()' and 'copy_tree()' functions in util.py now have
meaningful return values: respectively, whether the copy was done, and
the list of files that were copied.  This meant some trivial changes in
core.py as well: the Command methods that mirror 'copy_file()' and
'copy_tree()' have to pass on their return values.
diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py
index 980ba5b..4b8c783 100644
--- a/Lib/distutils/core.py
+++ b/Lib/distutils/core.py
@@ -636,10 +636,10 @@
                    preserve_mode=1, preserve_times=1, update=1, level=1):
         """Copy a file respecting verbose and dry-run flags."""
 
-        util.copy_file (infile, outfile,
-                        preserve_mode, preserve_times,
-                        update, self.distribution.verbose >= level,
-                        self.distribution.dry_run)
+        return util.copy_file (infile, outfile,
+                               preserve_mode, preserve_times,
+                               update, self.distribution.verbose >= level,
+                               self.distribution.dry_run)
 
 
     def copy_tree (self, infile, outfile,
@@ -648,10 +648,10 @@
         """Copy an entire directory tree respecting verbose and dry-run
            flags."""
 
-        util.copy_tree (infile, outfile, 
-                        preserve_mode, preserve_times, preserve_symlinks,
-                        update, self.distribution.verbose >= level,
-                        self.distribution.dry_run)
+        return util.copy_tree (infile, outfile, 
+                               preserve_mode,preserve_times,preserve_symlinks,
+                               update, self.distribution.verbose >= level,
+                               self.distribution.dry_run)
 
 
     def make_file (self, infiles, outfile, func, args,
diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py
index f4a1df7..7aedc1c 100644
--- a/Lib/distutils/util.py
+++ b/Lib/distutils/util.py
@@ -164,7 +164,11 @@
        'update' is true, 'src' will only be copied if 'dst' does not
        exist, or if 'dst' does exist but is older than 'src'.  If
        'verbose' is true, then a one-line summary of the copy will be
-       printed to stdout."""
+       printed to stdout.
+
+       Return true if the file was copied (or would have been copied),
+       false otherwise (ie. 'update' was true and the destination is
+       up-to-date)."""
 
     # XXX doesn't copy Mac-specific metadata
        
@@ -181,14 +185,15 @@
         dir = os.path.dirname (dst)
 
     if update and not newer (src, dst):
-        print "not copying %s (output up-to-date)" % src
-        return
+        if verbose:
+            print "not copying %s (output up-to-date)" % src
+        return 0
 
     if verbose:
         print "copying %s -> %s" % (src, dir)
 
     if dry_run:
-        return
+        return 1
 
     _copy_file_contents (src, dst)
     if preserve_mode or preserve_times:
@@ -198,6 +203,8 @@
         if preserve_times:
             os.utime (dst, (st[ST_ATIME], st[ST_MTIME]))
 
+    return 1
+
 # copy_file ()
 
 
@@ -213,9 +220,12 @@
     """Copy an entire directory tree 'src' to a new location 'dst'.  Both
        'src' and 'dst' must be directory names.  If 'src' is not a
        directory, raise DistutilsFileError.  If 'dst' does not exist, it
-       is created with 'mkpath'.  The endresult of the copy is that
+       is created with 'mkpath'.  The end result of the copy is that
        every file in 'src' is copied to 'dst', and directories under
-       'src' are recursively copied to 'dst'.
+       'src' are recursively copied to 'dst'.  Return the list of files
+       copied (under their output names) -- note that if 'update' is true,
+       this might be less than the list of files considered.  Return
+       value is not affected by 'dry_run'.
 
        'preserve_mode' and 'preserve_times' are the same as for
        'copy_file'; note that they only apply to regular files, not to
@@ -236,6 +246,8 @@
     if not dry_run:
         mkpath (dst, verbose=verbose)
 
+    outputs = []
+
     for n in names:
         src_name = os.path.join (src, n)
         dst_name = os.path.join (dst, n)
@@ -246,13 +258,19 @@
                 print "linking %s -> %s" % (dst_name, link_dest)
             if not dry_run:
                 os.symlink (link_dest, dst_name)
+            outputs.append (dst_name)
+            
         elif os.path.isdir (src_name):
-            copy_tree (src_name, dst_name,
-                       preserve_mode, preserve_times, preserve_symlinks,
-                       update, verbose, dry_run)
+            outputs[-1:] = \
+                copy_tree (src_name, dst_name,
+                           preserve_mode, preserve_times, preserve_symlinks,
+                           update, verbose, dry_run)
         else:
-            copy_file (src_name, dst_name,
-                       preserve_mode, preserve_times,
-                       update, verbose, dry_run)
+            if (copy_file (src_name, dst_name,
+                           preserve_mode, preserve_times,
+                           update, verbose, dry_run)):
+                outputs.append (dst_name)
+
+    return outputs
 
 # copy_tree ()