# newer_pairwise ()
-def newer_group (sources, target):
+def newer_group (sources, target, missing='error'):
"""Return true if 'target' is out-of-date with respect to any
file listed in 'sources'. In other words, if 'target' exists and
is newer than every file in 'sources', return false; otherwise
- return true."""
+ return true. 'missing' controls what we do when a source file is
+ missing; the default ("error") is to blow up with an OSError from
+ inside 'stat()'; if it is "ignore", we silently drop any missing
+ source files; if it is "newer", any missing source files make us
+ assume that 'target' is out-of-date (this is handy in "dry-run"
+ mode: it'll make you pretend to carry out commands that wouldn't
+ work because inputs are missing, but that doesn't matter because
+ you're not actually going to run the commands)."""
# If the target doesn't even exist, then it's definitely out-of-date.
if not os.path.exists (target):
from stat import ST_MTIME
target_mtime = os.stat (target)[ST_MTIME]
for source in sources:
+ if not os.path.exists (source):
+ if missing == 'error': # blow up when we stat() the file
+ pass
+ elif missing == 'ignore': # missing source dropped from
+ continue # target's dependency list
+ elif missing == 'newer': # missing source means target is
+ return 1 # out-of-date
+
source_mtime = os.stat(source)[ST_MTIME]
if source_mtime > target_mtime:
return 1