This line raises an exception if the md5 file doesn't exist:

    compute_fingerprint(files, dirs) != File.read(cache_file)

Putting it in the second `elsif` block ensures that the file exists.  Is there a more elegant way to express this?