title: How do I skip a shake Action?
body: <p>I'd like to download a bunch of web pages with shake, then do some processing on them. However, I'd also like the option to download the pages outside of shake, tell shake I've done so, and let shake continue with the remainder of the processing steps. Right now I'm working step two, "tell shake I've done some of its work for it".</p>
  
  <p>To give a minimal example, here's a very short shake script:</p>
  
  <pre><code>import Development.Shake
  
  main = shakeArgs shakeOptions $ do
      want ["test.txt"]
      "test.txt" %&gt; \_ -&gt; liftIO (putStrLn "yikes!")
  </code></pre>
  
  <p>I would like to find a way to prevent this script from printing <code>yikes!</code> (but still updating the database entry for <code>test.txt</code>). Running this with <code>--help</code>, I see in part:</p>
  
  <pre><code>--touch                     Assume targets are clean.
  </code></pre>
  
  <p>Which sounds promising. However:</p>
  
  <pre><code>% rm -r .shake &amp;&amp; ./test --touch
  yikes!
  Build completed in 0:01m
  </code></pre>
  
  <p>Perhaps it needs an explicit list of files to mark as new?</p>
  
  <pre><code>% rm -r .shake &amp;&amp; ./test --touch test.txt
  yikes!
  Build completed in 0:01m
  </code></pre>
  
  <p>Okay. Well, the <code>--help</code> also lists this:</p>
  
  <pre><code>-o FILE, --old-file=FILE, --assume-old=FILE
                              Consider FILE to be very old and don't remake it.
  </code></pre>
  
  <p>I find that a little puzzling: we now have a "clean/dirty" metaphor and a "old/new" metaphor, and it's not clear how if at all they are related. Moreover, surely if the file was old that would mean we <em>would</em> want to remake it, right? In any case, it doesn't seem to do what I want:</p>
  
  <pre><code>% rm -r .shake &amp;&amp; ./test -o test.txt
  yikes!
  Build completed in 0:01m
  </code></pre>
  
  <p>Okay... well, perhaps this option, which says the exact opposite of that one, will do what I want:</p>
  
  <pre><code>-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
                          Consider FILE to be infinitely new.
  </code></pre>
  
  <p>No dice:</p>
  
  <pre><code>% r .shake &amp;&amp; ./test -W test.txt
  yikes!
  Build completed in 0:01m
  </code></pre>
  
  <p>This leaves me with several questions:</p>
  
  <ul>
  <li>Most importantly: how can I ask shake <em>just</em> to update its database entry for <code>test.txt</code> without running the <code>Action</code> associated with <code>test.txt</code>?</li>
  <li>What does <code>--touch</code> do, and why didn't that help?</li>
  <li>What do <code>-o</code>/<code>-W</code> do, and why didn't they help?</li>
  <li>What is the relationship between old/new and clean/dirty?</li>
  </ul>