341 | </style></head><body><div id="coverage"><h1 id="overview">Coverage</h1><div id="menu"><li><a href="#overview">overview</a></li><li><span class="cov high">95</span><a href="#conditions.js"><span class="basename">conditions.js</span></a></li><li><span class="cov high">80</span><a href="#mecano.js"><span class="basename">mecano.js</span></a></li><li><span class="cov medium">73</span><a href="#misc.js"><span class="basename">misc.js</span></a></li><a id="logo" href="http://visionmedia.github.com/mocha/">m</a></div><div id="stats" class="high"><div class="percentage">81%</div><div class="sloc">513</div><div class="hits">418</div><div class="misses">95</div></div><div id="files"><div class="file"><h2 id="conditions.js">conditions.js</h2><div id="stats" class="high"><div class="percentage">95%</div><div class="sloc">41</div><div class="hits">39</div><div class="misses">2</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">// Generated by CoffeeScript 1.4.0</td></tr><tr class="hit"> <td class="line">2</td><td class="hits">1</td><td class="source">var each, fs, path, _ref;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">4</td><td class="hits">1</td><td class="source">fs = require('fs');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">6</td><td class="hits">1</td><td class="source">path = require('path');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">8</td><td class="hits">1</td><td class="source">if ((_ref = fs.exists) == null) {</td></tr><tr class="miss"> <td class="line">9</td><td class="hits">0</td><td class="source"> fs.exists = path.exists;</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">12</td><td class="hits">1</td><td class="source">each = require('each');</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source">/*</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source">Conditionnal properties</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source">*/</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">19</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> `all(options, failed, succeed)` Run all conditions</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> ---------------------------------------------------</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> `opts`</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> Command options</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> `failed`</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> Failed callback, called when a condition failed</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> `succeed`</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> Succeed callback, only called if all the condition succeed</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> all: function(options, failed, succeed) {</td></tr><tr class="hit"> <td class="line">36</td><td class="hits">39</td><td class="source"> return each([this["if"], this.if_exists, this.not_if_exists]).on('item', function(next, condition) {</td></tr><tr class="hit"> <td class="line">37</td><td class="hits">116</td><td class="source"> return condition(options, failed, next);</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> }).on('error', failed).on('end', succeed);</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> `if` Run action for a user defined condition</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> --------------------------------------------</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> Work on the property `if` in `options`. When `if` </td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> is a boolean, its value determine to the output. If it's </td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> a callback, the function is called with the `options`, </td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> `failed` and `succeed` arguments. If it'a an array, all its element</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> must positively resolve for the condition to pass.</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> Updating the content of a file if we are the owner</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> mecano.render</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> source:'./file'</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> if: (options, failed, succeed) -></td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> fs.stat options.source, (err, stat) -></td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> # File does not exists</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> return failed err if err</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> # Failed if we dont own the file</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> return failed() unless stat.uid is process.getuid()</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> # Succeed if we own the file</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> succeed()</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> "if": function(options, failed, succeed) {</td></tr><tr class="hit"> <td class="line">65</td><td class="hits">45</td><td class="source"> var ok;</td></tr><tr class="hit"> <td class="line">66</td><td class="hits">45</td><td class="source"> if (options["if"] == null) {</td></tr><tr class="hit"> <td class="line">67</td><td class="hits">40</td><td class="source"> return succeed();</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">69</td><td class="hits">5</td><td class="source"> ok = true;</td></tr><tr class="hit"> <td class="line">70</td><td class="hits">5</td><td class="source"> return each(options["if"]).on('item', function(next, si) {</td></tr><tr class="hit"> <td class="line">71</td><td class="hits">5</td><td class="source"> if (!ok) {</td></tr><tr class="miss"> <td class="line">72</td><td class="hits">0</td><td class="source"> return next();</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">74</td><td class="hits">5</td><td class="source"> if (typeof si === 'boolean') {</td></tr><tr class="hit"> <td class="line">75</td><td class="hits">2</td><td class="source"> if (!si) {</td></tr><tr class="hit"> <td class="line">76</td><td class="hits">1</td><td class="source"> ok = false;</td></tr><tr><td class="line">77</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">78</td><td class="hits">2</td><td class="source"> return next();</td></tr><tr class="hit"> <td class="line">79</td><td class="hits">3</td><td class="source"> } else if (typeof si === 'function') {</td></tr><tr class="hit"> <td class="line">80</td><td class="hits">3</td><td class="source"> return si(options, (function() {</td></tr><tr class="hit"> <td class="line">81</td><td class="hits">2</td><td class="source"> ok = false;</td></tr><tr class="hit"> <td class="line">82</td><td class="hits">2</td><td class="source"> return next.apply(null, arguments);</td></tr><tr><td class="line">83</td><td class="hits"></td><td class="source"> }), next);</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">86</td><td class="hits">5</td><td class="source"> if (err || !ok) {</td></tr><tr class="hit"> <td class="line">87</td><td class="hits">3</td><td class="source"> return failed(err);</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">89</td><td class="hits">2</td><td class="source"> return succeed();</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> `if_exists` Run action if a file exists</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> ----------------------------------------</td></tr><tr><td class="line">96</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> Work on the property `if_exists` in `options`. The value may </td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> be a file path or an array of file paths.</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> The callback `succeed` is called if all the provided paths </td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> exists otherwise the callback `failed` is called.</td></tr><tr><td class="line">102</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> if_exists: function(options, failed, succeed) {</td></tr><tr class="hit"> <td class="line">105</td><td class="hits">44</td><td class="source"> if (options.if_exists == null) {</td></tr><tr class="hit"> <td class="line">106</td><td class="hits">38</td><td class="source"> return succeed();</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">108</td><td class="hits">6</td><td class="source"> return each(options.if_exists).on('item', function(next, if_exists) {</td></tr><tr class="hit"> <td class="line">109</td><td class="hits">8</td><td class="source"> return fs.exists(if_exists, function(exists) {</td></tr><tr class="hit"> <td class="line">110</td><td class="hits">8</td><td class="source"> if (exists) {</td></tr><tr class="hit"> <td class="line">111</td><td class="hits">5</td><td class="source"> return next();</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">113</td><td class="hits">3</td><td class="source"> return failed();</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> }).on('end', succeed);</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> `not_if_exists` Skip action if a file exists</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> ---------------------------------------------</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> Work on the property `not_if_exists` in `options`. The value may </td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> be a file path or an array of file paths.</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> The callback `succeed` is called if none of the provided paths </td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> exists otherwise the callback `failed` is called.</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">129</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> not_if_exists: function(options, failed, succeed) {</td></tr><tr class="hit"> <td class="line">131</td><td class="hits">43</td><td class="source"> if (options.not_if_exists == null) {</td></tr><tr class="hit"> <td class="line">132</td><td class="hits">38</td><td class="source"> return succeed();</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">134</td><td class="hits">5</td><td class="source"> return each(options.not_if_exists).on('item', function(next, not_if_exists) {</td></tr><tr class="hit"> <td class="line">135</td><td class="hits">7</td><td class="source"> return fs.exists(not_if_exists, function(exists) {</td></tr><tr class="hit"> <td class="line">136</td><td class="hits">7</td><td class="source"> if (exists) {</td></tr><tr class="hit"> <td class="line">137</td><td class="hits">3</td><td class="source"> return failed();</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">139</td><td class="hits">4</td><td class="source"> return next();</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> }).on('end', succeed);</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div><div class="file"><h2 id="mecano.js">mecano.js</h2><div id="stats" class="high"><div class="percentage">80%</div><div class="sloc">426</div><div class="hits">345</div><div class="misses">81</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">// Generated by CoffeeScript 1.4.0</td></tr><tr class="hit"> <td class="line">2</td><td class="hits">1</td><td class="source">var conditions, each, eco, exec, fs, mecano, misc, open, path, rimraf, util, _ref;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">4</td><td class="hits">1</td><td class="source">fs = require('fs');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">6</td><td class="hits">1</td><td class="source">path = require('path');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">8</td><td class="hits">1</td><td class="source">if ((_ref = fs.exists) == null) {</td></tr><tr class="miss"> <td class="line">9</td><td class="hits">0</td><td class="source"> fs.exists = path.exists;</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source">}</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">12</td><td class="hits">1</td><td class="source">util = require('util');</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">14</td><td class="hits">1</td><td class="source">each = require('each');</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">16</td><td class="hits">1</td><td class="source">eco = require('eco');</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">18</td><td class="hits">1</td><td class="source">rimraf = require('rimraf');</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">20</td><td class="hits">1</td><td class="source">exec = require('child_process').exec;</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">22</td><td class="hits">1</td><td class="source">open = require('open-uri');</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">24</td><td class="hits">1</td><td class="source">conditions = require('./conditions');</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">26</td><td class="hits">1</td><td class="source">misc = require('./misc');</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source">/*</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source">Mecano gather a set of functions usually used during system deployment. All the functions share a </td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source">common API with flexible options.</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source">*/</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">35</td><td class="hits">1</td><td class="source">mecano = module.exports = {</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> `cp` `copy(options, callback)`</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> ------------------------------</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> Copy a file.</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> * `source` The file or directory to copy.</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> * `destination` Where the file or directory is copied.</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> * `force` Copy the file even if one already exists.</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> * `not_if_exists` Equals destination if true.</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> * `chmod` Permissions of the file or the parent directory</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> * `err` Error object if any. </td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> * `copied` Number of files or parent directories copied.</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> todo:</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> * deal with directories</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> * preserve permissions if `chmod` is `true`</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> * Compare files with checksum</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> copy: function(options, callback) {</td></tr><tr class="hit"> <td class="line">63</td><td class="hits">7</td><td class="source"> var copied;</td></tr><tr class="hit"> <td class="line">64</td><td class="hits">7</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">65</td><td class="hits">7</td><td class="source"> copied = 0;</td></tr><tr class="hit"> <td class="line">66</td><td class="hits">7</td><td class="source"> return each(options).on('item', function(next, options) {</td></tr><tr class="hit"> <td class="line">67</td><td class="hits">7</td><td class="source"> var chmod, copy, dstStat, finish, source;</td></tr><tr class="hit"> <td class="line">68</td><td class="hits">7</td><td class="source"> if (!options.source) {</td></tr><tr class="miss"> <td class="line">69</td><td class="hits">0</td><td class="source"> return next(new Error('Missing source'));</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">71</td><td class="hits">7</td><td class="source"> if (!options.destination) {</td></tr><tr class="miss"> <td class="line">72</td><td class="hits">0</td><td class="source"> return next(new Error('Missing destination'));</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">74</td><td class="hits">7</td><td class="source"> if (options.not_if_exists === true) {</td></tr><tr class="miss"> <td class="line">75</td><td class="hits">0</td><td class="source"> options.not_if_exists = options.destination;</td></tr><tr><td class="line">76</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">77</td><td class="hits">7</td><td class="source"> dstStat = null;</td></tr><tr class="hit"> <td class="line">78</td><td class="hits">7</td><td class="source"> source = function() {</td></tr><tr class="miss"> <td class="line">79</td><td class="hits">0</td><td class="source"> return fs.stat(options.source, function(err, stat) {</td></tr><tr class="miss"> <td class="line">80</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">81</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">83</td><td class="hits">0</td><td class="source"> if (stat.isDirectory()) {</td></tr><tr class="miss"> <td class="line">84</td><td class="hits">0</td><td class="source"> return next(new Error('Source is a directory'));</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">86</td><td class="hits">0</td><td class="source"> return copy();</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">89</td><td class="hits">7</td><td class="source"> copy = function(destination) {</td></tr><tr class="hit"> <td class="line">90</td><td class="hits">9</td><td class="source"> if (destination == null) {</td></tr><tr class="hit"> <td class="line">91</td><td class="hits">7</td><td class="source"> destination = options.destination;</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">93</td><td class="hits">9</td><td class="source"> return fs.stat(destination, function(err, stat) {</td></tr><tr class="hit"> <td class="line">94</td><td class="hits">9</td><td class="source"> var dirExists, fileExists, input, output;</td></tr><tr class="hit"> <td class="line">95</td><td class="hits">9</td><td class="source"> dstStat = stat;</td></tr><tr class="hit"> <td class="line">96</td><td class="hits">9</td><td class="source"> if (err && err.code !== 'ENOENT') {</td></tr><tr class="miss"> <td class="line">97</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">99</td><td class="hits">9</td><td class="source"> dirExists = !err && stat.isDirectory();</td></tr><tr class="hit"> <td class="line">100</td><td class="hits">9</td><td class="source"> fileExists = !err && stat.isFile();</td></tr><tr class="hit"> <td class="line">101</td><td class="hits">9</td><td class="source"> if (fileExists && !options.force) {</td></tr><tr class="hit"> <td class="line">102</td><td class="hits">2</td><td class="source"> return next(null, 0);</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">104</td><td class="hits">7</td><td class="source"> if (dirExists) {</td></tr><tr class="hit"> <td class="line">105</td><td class="hits">2</td><td class="source"> return copy(path.resolve(options.destination, path.basename(options.source)));</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">107</td><td class="hits">5</td><td class="source"> input = fs.createReadStream(options.source);</td></tr><tr class="hit"> <td class="line">108</td><td class="hits">5</td><td class="source"> output = fs.createWriteStream(destination);</td></tr><tr class="hit"> <td class="line">109</td><td class="hits">5</td><td class="source"> return util.pump(input, output, function(err) {</td></tr><tr class="hit"> <td class="line">110</td><td class="hits">5</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">111</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">113</td><td class="hits">5</td><td class="source"> return chmod();</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">117</td><td class="hits">7</td><td class="source"> chmod = function() {</td></tr><tr class="hit"> <td class="line">118</td><td class="hits">5</td><td class="source"> if (!options.chmod || options.chmod === dstStat.mode) {</td></tr><tr class="hit"> <td class="line">119</td><td class="hits">5</td><td class="source"> return finish();</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">121</td><td class="hits">0</td><td class="source"> return fs.chmod(options.destination, options.chmod, function(err) {</td></tr><tr class="miss"> <td class="line">122</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">123</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">125</td><td class="hits">0</td><td class="source"> return finish();</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">128</td><td class="hits">7</td><td class="source"> finish = function() {</td></tr><tr class="hit"> <td class="line">129</td><td class="hits">5</td><td class="source"> copied++;</td></tr><tr class="hit"> <td class="line">130</td><td class="hits">5</td><td class="source"> return next();</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">132</td><td class="hits">7</td><td class="source"> return conditions.all(options, next, copy);</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">134</td><td class="hits">7</td><td class="source"> return callback(err, copied);</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> `download(options, callback)`</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> -----------------------------</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> Download files using various protocols. The excellent </td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> [open-uri](https://github.com/publicclass/open-uri) module provides support for HTTP(S), </td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> file and FTP. All the options supported by open-uri are passed to it.</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">146</td><td class="hits"></td><td class="source"> Note, GIT is not yet supported but documented as a wished feature.</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">148</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">150</td><td class="hits"></td><td class="source"> * `source` File, HTTP URL, FTP, GIT repository. File is the default protocol if source is provided without a scheme. </td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> * `destination` Path where the file is downloaded. </td></tr><tr><td class="line">152</td><td class="hits"></td><td class="source"> * `force` Overwrite destination file if it exists. </td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">156</td><td class="hits"></td><td class="source"> * `err` Error object if any. </td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> * `downloaded` Number of downloaded files</td></tr><tr><td class="line">158</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">159</td><td class="hits"></td><td class="source"> Basic example:</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source"> mecano.download</td></tr><tr><td class="line">161</td><td class="hits"></td><td class="source"> source: 'https://github.com/wdavidw/node-sigar/tarball/v0.0.1'</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> destination: 'node-sigar.tgz'</td></tr><tr><td class="line">163</td><td class="hits"></td><td class="source"> , (err, downloaded) -></td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> fs.exists 'node-sigar.tgz', (exists) -></td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> assert.ok exists</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> download: function(options, callback) {</td></tr><tr class="hit"> <td class="line">169</td><td class="hits">6</td><td class="source"> var downloaded;</td></tr><tr class="hit"> <td class="line">170</td><td class="hits">6</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">171</td><td class="hits">6</td><td class="source"> downloaded = 0;</td></tr><tr class="hit"> <td class="line">172</td><td class="hits">6</td><td class="source"> return each(options).on('item', function(next, options) {</td></tr><tr class="hit"> <td class="line">173</td><td class="hits">6</td><td class="source"> var download, _ref1;</td></tr><tr class="hit"> <td class="line">174</td><td class="hits">6</td><td class="source"> if (!options.source) {</td></tr><tr class="miss"> <td class="line">175</td><td class="hits">0</td><td class="source"> return next(new Error("Missing source: " + options.source));</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">177</td><td class="hits">6</td><td class="source"> if (!options.destination) {</td></tr><tr class="miss"> <td class="line">178</td><td class="hits">0</td><td class="source"> return next(new Error("Missing destination: " + options.destination));</td></tr><tr><td class="line">179</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">180</td><td class="hits">6</td><td class="source"> if ((_ref1 = options.force) == null) {</td></tr><tr class="hit"> <td class="line">181</td><td class="hits">6</td><td class="source"> options.force = false;</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">183</td><td class="hits">6</td><td class="source"> download = function() {</td></tr><tr class="hit"> <td class="line">184</td><td class="hits">3</td><td class="source"> var destination;</td></tr><tr class="hit"> <td class="line">185</td><td class="hits">3</td><td class="source"> destination = fs.createWriteStream(options.destination);</td></tr><tr class="hit"> <td class="line">186</td><td class="hits">3</td><td class="source"> open(options.source, destination);</td></tr><tr class="hit"> <td class="line">187</td><td class="hits">3</td><td class="source"> destination.on('close', function() {</td></tr><tr class="hit"> <td class="line">188</td><td class="hits">3</td><td class="source"> downloaded++;</td></tr><tr class="hit"> <td class="line">189</td><td class="hits">3</td><td class="source"> return next();</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"> <td class="line">191</td><td class="hits">3</td><td class="source"> return destination.on('error', function(err) {</td></tr><tr class="miss"> <td class="line">192</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">195</td><td class="hits">6</td><td class="source"> return fs.exists(options.destination, function(exists) {</td></tr><tr class="hit"> <td class="line">196</td><td class="hits">6</td><td class="source"> if (exists && !options.force) {</td></tr><tr class="hit"> <td class="line">197</td><td class="hits">3</td><td class="source"> return next();</td></tr><tr class="hit"> <td class="line">198</td><td class="hits">3</td><td class="source"> } else if (exists) {</td></tr><tr class="miss"> <td class="line">199</td><td class="hits">0</td><td class="source"> return rimraf(options.destination, function(err) {</td></tr><tr class="miss"> <td class="line">200</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">201</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">203</td><td class="hits">0</td><td class="source"> return download();</td></tr><tr><td class="line">204</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">206</td><td class="hits">3</td><td class="source"> return download();</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">208</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">209</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">210</td><td class="hits">6</td><td class="source"> return callback(err, downloaded);</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">212</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> `exec` `execute([goptions], options, callback)`</td></tr><tr><td class="line">216</td><td class="hits"></td><td class="source"> -----------------------------------------------</td></tr><tr><td class="line">217</td><td class="hits"></td><td class="source"> Run a command locally or with ssh if the `host` is provided. Global options is</td></tr><tr><td class="line">218</td><td class="hits"></td><td class="source"> optional and is used in case where options is defined as an array of </td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> multiple commands. Note, `opts` inherites all the properties of `goptions`.</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> `goptions` Global options includes:</td></tr><tr><td class="line">222</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> * `parallel` Wether the command are run in sequential, parallel </td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source"> or limited concurrent mode. See the `node-each` documentation for more </td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source"> details. Default to sequential (false).</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> `options` Include all conditions as well as: </td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">229</td><td class="hits"></td><td class="source"> * `cmd` String, Object or array; Command to execute. </td></tr><tr><td class="line">230</td><td class="hits"></td><td class="source"> * `env` Environment variables, default to `process.env`. </td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> * `cwd` Current working directory. </td></tr><tr><td class="line">232</td><td class="hits"></td><td class="source"> * `uid` Unix user id. </td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> * `gid` Unix group id. </td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> * `code` Expected code(s) returned by the command, int or array of int, default to 0. </td></tr><tr><td class="line">235</td><td class="hits"></td><td class="source"> * `host` SSH host or IP address. </td></tr><tr><td class="line">236</td><td class="hits"></td><td class="source"> * `username` SSH host or IP address. </td></tr><tr><td class="line">237</td><td class="hits"></td><td class="source"> * `stdout` Writable EventEmitter in which command output will be piped. </td></tr><tr><td class="line">238</td><td class="hits"></td><td class="source"> * `stderr` Writable EventEmitter in which command error will be piped. </td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">240</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">241</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> * `err` Error if any. </td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> * `executed` Number of executed commandes. </td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source"> * `stdout` Stdout value(s) unless `stdout` option is provided. </td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> * `stderr` Stderr value(s) unless `stderr` option is provided.</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">247</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> execute: function(goptions, options, callback) {</td></tr><tr class="hit"> <td class="line">249</td><td class="hits">18</td><td class="source"> var escape, executed, isArray, stderrs, stdouts;</td></tr><tr class="hit"> <td class="line">250</td><td class="hits">18</td><td class="source"> if (arguments.length === 2) {</td></tr><tr class="hit"> <td class="line">251</td><td class="hits">18</td><td class="source"> callback = options;</td></tr><tr class="hit"> <td class="line">252</td><td class="hits">18</td><td class="source"> options = goptions;</td></tr><tr><td class="line">253</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">254</td><td class="hits">18</td><td class="source"> isArray = Array.isArray(options);</td></tr><tr class="hit"> <td class="line">255</td><td class="hits">18</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">256</td><td class="hits">18</td><td class="source"> executed = 0;</td></tr><tr class="hit"> <td class="line">257</td><td class="hits">18</td><td class="source"> stdouts = [];</td></tr><tr class="hit"> <td class="line">258</td><td class="hits">18</td><td class="source"> stderrs = [];</td></tr><tr class="hit"> <td class="line">259</td><td class="hits">18</td><td class="source"> escape = function(cmd) {</td></tr><tr class="hit"> <td class="line">260</td><td class="hits">1</td><td class="source"> var char, esccmd, _i, _len;</td></tr><tr class="hit"> <td class="line">261</td><td class="hits">1</td><td class="source"> esccmd = '';</td></tr><tr class="hit"> <td class="line">262</td><td class="hits">1</td><td class="source"> for (_i = 0, _len = cmd.length; _i < _len; _i++) {</td></tr><tr class="hit"> <td class="line">263</td><td class="hits">20</td><td class="source"> char = cmd[_i];</td></tr><tr class="hit"> <td class="line">264</td><td class="hits">20</td><td class="source"> if (char === '$') {</td></tr><tr class="hit"> <td class="line">265</td><td class="hits">1</td><td class="source"> esccmd += '\\';</td></tr><tr><td class="line">266</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">267</td><td class="hits">20</td><td class="source"> esccmd += char;</td></tr><tr><td class="line">268</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">269</td><td class="hits">1</td><td class="source"> return esccmd;</td></tr><tr><td class="line">270</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">271</td><td class="hits">18</td><td class="source"> return each(options).parallel(goptions.parallel).on('item', function(next, option, i) {</td></tr><tr class="hit"> <td class="line">272</td><td class="hits">18</td><td class="source"> var cmd, cmdOption, _ref1;</td></tr><tr class="hit"> <td class="line">273</td><td class="hits">18</td><td class="source"> if (typeof option === 'string') {</td></tr><tr class="miss"> <td class="line">274</td><td class="hits">0</td><td class="source"> option = {</td></tr><tr><td class="line">275</td><td class="hits"></td><td class="source"> cmd: option</td></tr><tr><td class="line">276</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">277</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">278</td><td class="hits">18</td><td class="source"> misc.merge(true, option, goptions);</td></tr><tr class="hit"> <td class="line">279</td><td class="hits">18</td><td class="source"> if (option.cmd == null) {</td></tr><tr class="miss"> <td class="line">280</td><td class="hits">0</td><td class="source"> return next(new Error("Missing cmd: " + option.cmd));</td></tr><tr><td class="line">281</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">282</td><td class="hits">18</td><td class="source"> if ((_ref1 = option.code) == null) {</td></tr><tr class="hit"> <td class="line">283</td><td class="hits">17</td><td class="source"> option.code = [0];</td></tr><tr><td class="line">284</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">285</td><td class="hits">18</td><td class="source"> if (!Array.isArray(option.code)) {</td></tr><tr class="miss"> <td class="line">286</td><td class="hits">0</td><td class="source"> option.code = [option.code];</td></tr><tr><td class="line">287</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">288</td><td class="hits">18</td><td class="source"> cmdOption = {};</td></tr><tr class="hit"> <td class="line">289</td><td class="hits">18</td><td class="source"> cmdOption.env = option.env || process.env;</td></tr><tr class="hit"> <td class="line">290</td><td class="hits">18</td><td class="source"> cmdOption.cwd = option.cwd || null;</td></tr><tr class="hit"> <td class="line">291</td><td class="hits">18</td><td class="source"> if (options.uid) {</td></tr><tr class="miss"> <td class="line">292</td><td class="hits">0</td><td class="source"> cmdOption.uid = option.uid;</td></tr><tr><td class="line">293</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">294</td><td class="hits">18</td><td class="source"> if (options.gid) {</td></tr><tr class="miss"> <td class="line">295</td><td class="hits">0</td><td class="source"> cmdOption.gid = option.gid;</td></tr><tr><td class="line">296</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">297</td><td class="hits">18</td><td class="source"> cmd = function() {</td></tr><tr class="hit"> <td class="line">298</td><td class="hits">17</td><td class="source"> var run, stderr, stdout;</td></tr><tr class="hit"> <td class="line">299</td><td class="hits">17</td><td class="source"> if (option.host) {</td></tr><tr class="hit"> <td class="line">300</td><td class="hits">1</td><td class="source"> option.cmd = escape(option.cmd);</td></tr><tr class="hit"> <td class="line">301</td><td class="hits">1</td><td class="source"> option.cmd = option.host + ' "' + option.cmd + '"';</td></tr><tr class="hit"> <td class="line">302</td><td class="hits">1</td><td class="source"> if (option.username) {</td></tr><tr class="miss"> <td class="line">303</td><td class="hits">0</td><td class="source"> option.cmd = option.username + '@' + option.cmd;</td></tr><tr><td class="line">304</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">305</td><td class="hits">1</td><td class="source"> option.cmd = 'ssh -o StrictHostKeyChecking=no ' + option.cmd;</td></tr><tr><td class="line">306</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">307</td><td class="hits">17</td><td class="source"> run = exec(option.cmd, cmdOption);</td></tr><tr class="hit"> <td class="line">308</td><td class="hits">17</td><td class="source"> stdout = stderr = '';</td></tr><tr class="hit"> <td class="line">309</td><td class="hits">17</td><td class="source"> if (option.stdout) {</td></tr><tr class="hit"> <td class="line">310</td><td class="hits">1</td><td class="source"> run.stdout.pipe(option.stdout);</td></tr><tr><td class="line">311</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">312</td><td class="hits">16</td><td class="source"> run.stdout.on('data', function(data) {</td></tr><tr class="hit"> <td class="line">313</td><td class="hits">13</td><td class="source"> return stdout += data;</td></tr><tr><td class="line">314</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">315</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">316</td><td class="hits">17</td><td class="source"> if (option.stderr) {</td></tr><tr class="miss"> <td class="line">317</td><td class="hits">0</td><td class="source"> run.stderr.pipe(option.stderr);</td></tr><tr><td class="line">318</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">319</td><td class="hits">17</td><td class="source"> run.stderr.on('data', function(data) {</td></tr><tr class="hit"> <td class="line">320</td><td class="hits">5</td><td class="source"> return stderr += data;</td></tr><tr><td class="line">321</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">322</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">323</td><td class="hits">17</td><td class="source"> return run.on("exit", function(code) {</td></tr><tr class="hit"> <td class="line">324</td><td class="hits">17</td><td class="source"> return setTimeout(function() {</td></tr><tr class="hit"> <td class="line">325</td><td class="hits">17</td><td class="source"> var err;</td></tr><tr class="hit"> <td class="line">326</td><td class="hits">17</td><td class="source"> executed++;</td></tr><tr class="hit"> <td class="line">327</td><td class="hits">17</td><td class="source"> stdouts.push(option.stdout ? void 0 : stdout);</td></tr><tr class="hit"> <td class="line">328</td><td class="hits">17</td><td class="source"> stderrs.push(option.stderr ? void 0 : stderr);</td></tr><tr class="hit"> <td class="line">329</td><td class="hits">17</td><td class="source"> if (option.code.indexOf(code) === -1) {</td></tr><tr class="hit"> <td class="line">330</td><td class="hits">1</td><td class="source"> err = new Error("Invalid exec code " + code);</td></tr><tr class="hit"> <td class="line">331</td><td class="hits">1</td><td class="source"> err.code = code;</td></tr><tr class="hit"> <td class="line">332</td><td class="hits">1</td><td class="source"> return next(err);</td></tr><tr><td class="line">333</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">334</td><td class="hits">16</td><td class="source"> return next();</td></tr><tr><td class="line">335</td><td class="hits"></td><td class="source"> }, 1);</td></tr><tr><td class="line">336</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">337</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">338</td><td class="hits">18</td><td class="source"> return conditions.all(option, next, cmd);</td></tr><tr><td class="line">339</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">340</td><td class="hits">18</td><td class="source"> if (!isArray) {</td></tr><tr class="hit"> <td class="line">341</td><td class="hits">18</td><td class="source"> stdouts = stdouts[0];</td></tr><tr><td class="line">342</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">343</td><td class="hits">18</td><td class="source"> if (!isArray) {</td></tr><tr class="hit"> <td class="line">344</td><td class="hits">18</td><td class="source"> stderrs = stderrs[0];</td></tr><tr><td class="line">345</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">346</td><td class="hits">18</td><td class="source"> return callback(err, executed, stdouts, stderrs);</td></tr><tr><td class="line">347</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">348</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">349</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">350</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">351</td><td class="hits"></td><td class="source"> `extract(options, callback)` </td></tr><tr><td class="line">352</td><td class="hits"></td><td class="source"> ----------------------------</td></tr><tr><td class="line">353</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">354</td><td class="hits"></td><td class="source"> Extract an archive. Multiple compression types are supported. Unless </td></tr><tr><td class="line">355</td><td class="hits"></td><td class="source"> specified asan option, format is derived from the source extension. At the </td></tr><tr><td class="line">356</td><td class="hits"></td><td class="source"> moment, supported extensions are '.tgz', '.tar.gz' and '.zip'. </td></tr><tr><td class="line">357</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">358</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">359</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">360</td><td class="hits"></td><td class="source"> * `source` Archive to decompress. </td></tr><tr><td class="line">361</td><td class="hits"></td><td class="source"> * `destination` Default to the source parent directory. </td></tr><tr><td class="line">362</td><td class="hits"></td><td class="source"> * `format` One of 'tgz' or 'zip'. </td></tr><tr><td class="line">363</td><td class="hits"></td><td class="source"> * `creates` Ensure the given file is created or an error is send in the callback. </td></tr><tr><td class="line">364</td><td class="hits"></td><td class="source"> * `not_if_exists` Cancel extraction if file exists. </td></tr><tr><td class="line">365</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">366</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">367</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">368</td><td class="hits"></td><td class="source"> * `err` Error object if any. </td></tr><tr><td class="line">369</td><td class="hits"></td><td class="source"> * `extracted` Number of extracted archives.</td></tr><tr><td class="line">370</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">371</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">372</td><td class="hits"></td><td class="source"> extract: function(options, callback) {</td></tr><tr class="hit"> <td class="line">373</td><td class="hits">10</td><td class="source"> var extracted;</td></tr><tr class="hit"> <td class="line">374</td><td class="hits">10</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">375</td><td class="hits">10</td><td class="source"> extracted = 0;</td></tr><tr class="hit"> <td class="line">376</td><td class="hits">10</td><td class="source"> return each(options).on('item', function(next, options) {</td></tr><tr class="hit"> <td class="line">377</td><td class="hits">10</td><td class="source"> var creates, destination, ext, extract, format, success, _ref1;</td></tr><tr class="hit"> <td class="line">378</td><td class="hits">10</td><td class="source"> if (!options.source) {</td></tr><tr class="miss"> <td class="line">379</td><td class="hits">0</td><td class="source"> return next(new Error("Missing source: " + options.source));</td></tr><tr><td class="line">380</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">381</td><td class="hits">10</td><td class="source"> destination = (_ref1 = options.destination) != null ? _ref1 : path.dirname(options.source);</td></tr><tr class="hit"> <td class="line">382</td><td class="hits">10</td><td class="source"> if (options.format != null) {</td></tr><tr class="miss"> <td class="line">383</td><td class="hits">0</td><td class="source"> format = options.format;</td></tr><tr><td class="line">384</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">385</td><td class="hits">10</td><td class="source"> if (/\.(tar\.gz|tgz)$/.test(options.source)) {</td></tr><tr class="hit"> <td class="line">386</td><td class="hits">5</td><td class="source"> format = 'tgz';</td></tr><tr class="hit"> <td class="line">387</td><td class="hits">5</td><td class="source"> } else if (/\.zip$/.test(options.source)) {</td></tr><tr class="hit"> <td class="line">388</td><td class="hits">4</td><td class="source"> format = 'zip';</td></tr><tr><td class="line">389</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">390</td><td class="hits">1</td><td class="source"> ext = path.extname(options.source);</td></tr><tr class="hit"> <td class="line">391</td><td class="hits">1</td><td class="source"> return next(new Error("Unsupported extension, got " + (JSON.stringify(ext))));</td></tr><tr><td class="line">392</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">393</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">394</td><td class="hits">9</td><td class="source"> extract = function() {</td></tr><tr class="hit"> <td class="line">395</td><td class="hits">8</td><td class="source"> var cmd;</td></tr><tr class="hit"> <td class="line">396</td><td class="hits">8</td><td class="source"> cmd = null;</td></tr><tr class="hit"> <td class="line">397</td><td class="hits">8</td><td class="source"> switch (format) {</td></tr><tr><td class="line">398</td><td class="hits"></td><td class="source"> case 'tgz':</td></tr><tr class="hit"> <td class="line">399</td><td class="hits">4</td><td class="source"> cmd = "tar xzf " + options.source + " -C " + destination;</td></tr><tr class="hit"> <td class="line">400</td><td class="hits">4</td><td class="source"> break;</td></tr><tr><td class="line">401</td><td class="hits"></td><td class="source"> case 'zip':</td></tr><tr class="hit"> <td class="line">402</td><td class="hits">4</td><td class="source"> cmd = "unzip -u " + options.source + " -d " + destination;</td></tr><tr><td class="line">403</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">404</td><td class="hits">8</td><td class="source"> return exec(cmd, function(err, stdout, stderr) {</td></tr><tr class="hit"> <td class="line">405</td><td class="hits">8</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">406</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">407</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">408</td><td class="hits">8</td><td class="source"> return creates();</td></tr><tr><td class="line">409</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">410</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">411</td><td class="hits">9</td><td class="source"> creates = function() {</td></tr><tr class="hit"> <td class="line">412</td><td class="hits">8</td><td class="source"> if (options.creates == null) {</td></tr><tr class="hit"> <td class="line">413</td><td class="hits">6</td><td class="source"> return success();</td></tr><tr><td class="line">414</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">415</td><td class="hits">2</td><td class="source"> return fs.exists(options.creates, function(exists) {</td></tr><tr class="hit"> <td class="line">416</td><td class="hits">2</td><td class="source"> if (!exists) {</td></tr><tr class="hit"> <td class="line">417</td><td class="hits">1</td><td class="source"> return next(new Error("Failed to create '" + (path.basename(options.creates)) + "'"));</td></tr><tr><td class="line">418</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">419</td><td class="hits">1</td><td class="source"> return success();</td></tr><tr><td class="line">420</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">421</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">422</td><td class="hits">9</td><td class="source"> success = function() {</td></tr><tr class="hit"> <td class="line">423</td><td class="hits">7</td><td class="source"> extracted++;</td></tr><tr class="hit"> <td class="line">424</td><td class="hits">7</td><td class="source"> return next();</td></tr><tr><td class="line">425</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">426</td><td class="hits">9</td><td class="source"> return conditions.all(options, next, extract);</td></tr><tr><td class="line">427</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">428</td><td class="hits">10</td><td class="source"> return callback(err, extracted);</td></tr><tr><td class="line">429</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">430</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">431</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">432</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">433</td><td class="hits"></td><td class="source"> `git`</td></tr><tr><td class="line">434</td><td class="hits"></td><td class="source"> -----</td></tr><tr><td class="line">435</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">436</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">437</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">438</td><td class="hits"></td><td class="source"> * `source` Git source repository address.</td></tr><tr><td class="line">439</td><td class="hits"></td><td class="source"> * `destination` Directory where to clone the repository.</td></tr><tr><td class="line">440</td><td class="hits"></td><td class="source"> * `revision` Git revision, branch or tag.</td></tr><tr><td class="line">441</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">442</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">443</td><td class="hits"></td><td class="source"> git: function(options, callback) {</td></tr><tr class="hit"> <td class="line">444</td><td class="hits">5</td><td class="source"> var updated;</td></tr><tr class="hit"> <td class="line">445</td><td class="hits">5</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">446</td><td class="hits">5</td><td class="source"> updated = 0;</td></tr><tr class="hit"> <td class="line">447</td><td class="hits">5</td><td class="source"> return each(options).on('item', function(next, options) {</td></tr><tr class="hit"> <td class="line">448</td><td class="hits">5</td><td class="source"> var checkout, clone, log, prepare, rev, _ref1;</td></tr><tr class="hit"> <td class="line">449</td><td class="hits">5</td><td class="source"> if ((_ref1 = options.revision) == null) {</td></tr><tr class="hit"> <td class="line">450</td><td class="hits">3</td><td class="source"> options.revision = 'HEAD';</td></tr><tr><td class="line">451</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">452</td><td class="hits">5</td><td class="source"> rev = null;</td></tr><tr class="hit"> <td class="line">453</td><td class="hits">5</td><td class="source"> prepare = function() {</td></tr><tr class="hit"> <td class="line">454</td><td class="hits">5</td><td class="source"> return fs.stat(options.destination, function(err, stat) {</td></tr><tr class="hit"> <td class="line">455</td><td class="hits">5</td><td class="source"> var gitDir;</td></tr><tr class="hit"> <td class="line">456</td><td class="hits">5</td><td class="source"> if (err && err.code === 'ENOENT') {</td></tr><tr class="hit"> <td class="line">457</td><td class="hits">2</td><td class="source"> return clone();</td></tr><tr><td class="line">458</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">459</td><td class="hits">3</td><td class="source"> if (!stat.isDirectory()) {</td></tr><tr class="miss"> <td class="line">460</td><td class="hits">0</td><td class="source"> return next(new Error("Destination not a directory, got " + options.destination));</td></tr><tr><td class="line">461</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">462</td><td class="hits">3</td><td class="source"> gitDir = "" + options.destination + "/.git";</td></tr><tr class="hit"> <td class="line">463</td><td class="hits">3</td><td class="source"> return fs.stat(gitDir, function(err, stat) {</td></tr><tr class="hit"> <td class="line">464</td><td class="hits">3</td><td class="source"> if (err || !stat.isDirectory()) {</td></tr><tr class="miss"> <td class="line">465</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">466</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">467</td><td class="hits">3</td><td class="source"> return log();</td></tr><tr><td class="line">468</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">469</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">470</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">471</td><td class="hits">5</td><td class="source"> clone = function() {</td></tr><tr class="hit"> <td class="line">472</td><td class="hits">2</td><td class="source"> return mecano.exec({</td></tr><tr><td class="line">473</td><td class="hits"></td><td class="source"> cmd: "git clone " + options.source + " " + (path.basename(options.destination)),</td></tr><tr><td class="line">474</td><td class="hits"></td><td class="source"> cwd: path.dirname(options.destination)</td></tr><tr><td class="line">475</td><td class="hits"></td><td class="source"> }, function(err, executed, stdout, stderr) {</td></tr><tr class="hit"> <td class="line">476</td><td class="hits">2</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">477</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">478</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">479</td><td class="hits">2</td><td class="source"> return checkout();</td></tr><tr><td class="line">480</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">481</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">482</td><td class="hits">5</td><td class="source"> log = function() {</td></tr><tr class="hit"> <td class="line">483</td><td class="hits">3</td><td class="source"> return mecano.exec({</td></tr><tr><td class="line">484</td><td class="hits"></td><td class="source"> cmd: "git log --pretty=format:'%H' -n 1",</td></tr><tr><td class="line">485</td><td class="hits"></td><td class="source"> cwd: options.destination</td></tr><tr><td class="line">486</td><td class="hits"></td><td class="source"> }, function(err, executed, stdout, stderr) {</td></tr><tr class="hit"> <td class="line">487</td><td class="hits">3</td><td class="source"> var current;</td></tr><tr class="hit"> <td class="line">488</td><td class="hits">3</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">489</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">490</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">491</td><td class="hits">3</td><td class="source"> current = stdout.trim();</td></tr><tr class="hit"> <td class="line">492</td><td class="hits">3</td><td class="source"> return mecano.exec({</td></tr><tr><td class="line">493</td><td class="hits"></td><td class="source"> cmd: "git rev-list --max-count=1 " + options.revision,</td></tr><tr><td class="line">494</td><td class="hits"></td><td class="source"> cwd: options.destination</td></tr><tr><td class="line">495</td><td class="hits"></td><td class="source"> }, function(err, executed, stdout, stderr) {</td></tr><tr class="hit"> <td class="line">496</td><td class="hits">3</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">497</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">498</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">499</td><td class="hits">3</td><td class="source"> if (stdout.trim() !== current) {</td></tr><tr class="hit"> <td class="line">500</td><td class="hits">1</td><td class="source"> return checkout();</td></tr><tr><td class="line">501</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">502</td><td class="hits">2</td><td class="source"> return next();</td></tr><tr><td class="line">503</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">504</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">505</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">506</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">507</td><td class="hits">5</td><td class="source"> checkout = function() {</td></tr><tr class="hit"> <td class="line">508</td><td class="hits">3</td><td class="source"> return mecano.exec({</td></tr><tr><td class="line">509</td><td class="hits"></td><td class="source"> cmd: "git checkout " + options.revision,</td></tr><tr><td class="line">510</td><td class="hits"></td><td class="source"> cwd: options.destination</td></tr><tr><td class="line">511</td><td class="hits"></td><td class="source"> }, function(err) {</td></tr><tr class="hit"> <td class="line">512</td><td class="hits">3</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">513</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">514</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">515</td><td class="hits">3</td><td class="source"> updated++;</td></tr><tr class="hit"> <td class="line">516</td><td class="hits">3</td><td class="source"> return next();</td></tr><tr><td class="line">517</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">518</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">519</td><td class="hits">5</td><td class="source"> return conditions.all(options, next, prepare);</td></tr><tr><td class="line">520</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">521</td><td class="hits">5</td><td class="source"> return callback(err, updated);</td></tr><tr><td class="line">522</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">523</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">524</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">525</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">526</td><td class="hits"></td><td class="source"> `ln` `link(options, callback)`</td></tr><tr><td class="line">527</td><td class="hits"></td><td class="source"> ------------------------------</td></tr><tr><td class="line">528</td><td class="hits"></td><td class="source"> Create a symbolic link and it's parent directories if they don't yet</td></tr><tr><td class="line">529</td><td class="hits"></td><td class="source"> exist.</td></tr><tr><td class="line">530</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">531</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">532</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">533</td><td class="hits"></td><td class="source"> * `source` Referenced file to be linked. </td></tr><tr><td class="line">534</td><td class="hits"></td><td class="source"> * `destination` Symbolic link to be created. </td></tr><tr><td class="line">535</td><td class="hits"></td><td class="source"> * `exec` Create an executable file with an `exec` command. </td></tr><tr><td class="line">536</td><td class="hits"></td><td class="source"> * `chmod` Default to 0755. </td></tr><tr><td class="line">537</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">538</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">539</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">540</td><td class="hits"></td><td class="source"> * `err` Error object if any. </td></tr><tr><td class="line">541</td><td class="hits"></td><td class="source"> * `linked` Number of created links.</td></tr><tr><td class="line">542</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">543</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">544</td><td class="hits"></td><td class="source"> link: function(options, callback) {</td></tr><tr class="hit"> <td class="line">545</td><td class="hits">8</td><td class="source"> var exec_create, exec_exists, linked, option, parents, sym_create, sym_exists;</td></tr><tr class="hit"> <td class="line">546</td><td class="hits">8</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">547</td><td class="hits">8</td><td class="source"> linked = 0;</td></tr><tr class="hit"> <td class="line">548</td><td class="hits">8</td><td class="source"> sym_exists = function(option, callback) {</td></tr><tr class="hit"> <td class="line">549</td><td class="hits">7</td><td class="source"> return fs.exists(option.destination, function(exists) {</td></tr><tr class="hit"> <td class="line">550</td><td class="hits">7</td><td class="source"> if (!exists) {</td></tr><tr class="hit"> <td class="line">551</td><td class="hits">5</td><td class="source"> return callback(null, false);</td></tr><tr><td class="line">552</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">553</td><td class="hits">2</td><td class="source"> return fs.readlink(option.destination, function(err, resolvedPath) {</td></tr><tr class="hit"> <td class="line">554</td><td class="hits">2</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">555</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">556</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">557</td><td class="hits">2</td><td class="source"> if (resolvedPath === option.source) {</td></tr><tr class="hit"> <td class="line">558</td><td class="hits">2</td><td class="source"> return callback(null, true);</td></tr><tr><td class="line">559</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">560</td><td class="hits">0</td><td class="source"> return fs.unlink(option.destination, function(err) {</td></tr><tr class="miss"> <td class="line">561</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">562</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">563</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">564</td><td class="hits">0</td><td class="source"> return callback(null, false);</td></tr><tr><td class="line">565</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">566</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">567</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">568</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">569</td><td class="hits">8</td><td class="source"> sym_create = function(option, callback) {</td></tr><tr class="hit"> <td class="line">570</td><td class="hits">5</td><td class="source"> return fs.symlink(option.source, option.destination, function(err) {</td></tr><tr class="hit"> <td class="line">571</td><td class="hits">5</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">572</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">573</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">574</td><td class="hits">5</td><td class="source"> linked++;</td></tr><tr class="hit"> <td class="line">575</td><td class="hits">5</td><td class="source"> return callback();</td></tr><tr><td class="line">576</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">577</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">578</td><td class="hits">8</td><td class="source"> exec_exists = function(option, callback) {</td></tr><tr class="miss"> <td class="line">579</td><td class="hits">0</td><td class="source"> return fs.exists(option.destination, function(exists) {</td></tr><tr class="miss"> <td class="line">580</td><td class="hits">0</td><td class="source"> if (!exists) {</td></tr><tr class="miss"> <td class="line">581</td><td class="hits">0</td><td class="source"> return callback(null, false);</td></tr><tr><td class="line">582</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">583</td><td class="hits">0</td><td class="source"> return fs.readFile(option.destination, 'ascii', function(err, content) {</td></tr><tr class="miss"> <td class="line">584</td><td class="hits">0</td><td class="source"> var exec_cmd;</td></tr><tr class="miss"> <td class="line">585</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">586</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">587</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">588</td><td class="hits">0</td><td class="source"> exec_cmd = /exec (.*) \$@/.exec(content)[1];</td></tr><tr class="miss"> <td class="line">589</td><td class="hits">0</td><td class="source"> return callback(null, exec_cmd && exec_cmd === option.source);</td></tr><tr><td class="line">590</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">591</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">592</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">593</td><td class="hits">8</td><td class="source"> exec_create = function(option, callback) {</td></tr><tr class="miss"> <td class="line">594</td><td class="hits">0</td><td class="source"> var content;</td></tr><tr class="miss"> <td class="line">595</td><td class="hits">0</td><td class="source"> content = "#!/bin/bash\nexec " + option.source + " $@";</td></tr><tr class="miss"> <td class="line">596</td><td class="hits">0</td><td class="source"> return fs.writeFile(option.destination, content, function(err) {</td></tr><tr class="miss"> <td class="line">597</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">598</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">599</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">600</td><td class="hits">0</td><td class="source"> return fs.chmod(option.destination, option.chmod, function(err) {</td></tr><tr class="miss"> <td class="line">601</td><td class="hits">0</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">602</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">603</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">604</td><td class="hits">0</td><td class="source"> linked++;</td></tr><tr class="miss"> <td class="line">605</td><td class="hits">0</td><td class="source"> return callback();</td></tr><tr><td class="line">606</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">607</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">608</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">609</td><td class="hits">8</td><td class="source"> parents = (function() {</td></tr><tr class="hit"> <td class="line">610</td><td class="hits">8</td><td class="source"> var _i, _len, _results;</td></tr><tr class="hit"> <td class="line">611</td><td class="hits">8</td><td class="source"> _results = [];</td></tr><tr class="hit"> <td class="line">612</td><td class="hits">8</td><td class="source"> for (_i = 0, _len = options.length; _i < _len; _i++) {</td></tr><tr class="hit"> <td class="line">613</td><td class="hits">9</td><td class="source"> option = options[_i];</td></tr><tr class="hit"> <td class="line">614</td><td class="hits">9</td><td class="source"> _results.push(path.normalize(path.dirname(option.destination)));</td></tr><tr><td class="line">615</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">616</td><td class="hits">8</td><td class="source"> return _results;</td></tr><tr><td class="line">617</td><td class="hits"></td><td class="source"> })();</td></tr><tr class="hit"> <td class="line">618</td><td class="hits">8</td><td class="source"> return mecano.mkdir(parents, function(err, created) {</td></tr><tr class="hit"> <td class="line">619</td><td class="hits">8</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">620</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">621</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">622</td><td class="hits">8</td><td class="source"> return each(options).parallel(true).on('item', function(next, option) {</td></tr><tr class="hit"> <td class="line">623</td><td class="hits">9</td><td class="source"> var dispatch, _ref1;</td></tr><tr class="hit"> <td class="line">624</td><td class="hits">9</td><td class="source"> if (!option.source) {</td></tr><tr class="hit"> <td class="line">625</td><td class="hits">1</td><td class="source"> return next(new Error("Missing source, got " + (JSON.stringify(option.source))));</td></tr><tr><td class="line">626</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">627</td><td class="hits">8</td><td class="source"> if (!option.destination) {</td></tr><tr class="hit"> <td class="line">628</td><td class="hits">1</td><td class="source"> return next(new Error("Missing destination, got " + (JSON.stringify(option.destination))));</td></tr><tr><td class="line">629</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">630</td><td class="hits">7</td><td class="source"> if ((_ref1 = option.chmod) == null) {</td></tr><tr class="hit"> <td class="line">631</td><td class="hits">7</td><td class="source"> option.chmod = 0x1ed;</td></tr><tr><td class="line">632</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">633</td><td class="hits">7</td><td class="source"> dispatch = function() {</td></tr><tr class="hit"> <td class="line">634</td><td class="hits">7</td><td class="source"> if (option.exec) {</td></tr><tr class="miss"> <td class="line">635</td><td class="hits">0</td><td class="source"> return exec_exists(option, function(err, exists) {</td></tr><tr class="miss"> <td class="line">636</td><td class="hits">0</td><td class="source"> if (exists) {</td></tr><tr class="miss"> <td class="line">637</td><td class="hits">0</td><td class="source"> return next();</td></tr><tr><td class="line">638</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">639</td><td class="hits">0</td><td class="source"> return exec_create(option, next);</td></tr><tr><td class="line">640</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">641</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"> <td class="line">642</td><td class="hits">7</td><td class="source"> return sym_exists(option, function(err, exists) {</td></tr><tr class="hit"> <td class="line">643</td><td class="hits">7</td><td class="source"> if (exists) {</td></tr><tr class="hit"> <td class="line">644</td><td class="hits">2</td><td class="source"> return next();</td></tr><tr><td class="line">645</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">646</td><td class="hits">5</td><td class="source"> return sym_create(option, next);</td></tr><tr><td class="line">647</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">648</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">649</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">650</td><td class="hits">7</td><td class="source"> return dispatch();</td></tr><tr><td class="line">651</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">652</td><td class="hits">8</td><td class="source"> return callback(err, linked);</td></tr><tr><td class="line">653</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">654</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">655</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">656</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">657</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">658</td><td class="hits"></td><td class="source"> `mkdir(options, callback)`</td></tr><tr><td class="line">659</td><td class="hits"></td><td class="source"> --------------------------</td></tr><tr><td class="line">660</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">661</td><td class="hits"></td><td class="source"> Recursively create a directory. The behavior is similar to the Unix command `mkdir -p`. </td></tr><tr><td class="line">662</td><td class="hits"></td><td class="source"> It supports an alternative syntax where options is simply the path of the directory</td></tr><tr><td class="line">663</td><td class="hits"></td><td class="source"> to create.</td></tr><tr><td class="line">664</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">665</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">666</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">667</td><td class="hits"></td><td class="source"> * `source` Path or array of paths. </td></tr><tr><td class="line">668</td><td class="hits"></td><td class="source"> * `directory` Shortcut for `source`</td></tr><tr><td class="line">669</td><td class="hits"></td><td class="source"> * `exclude` Regular expression. </td></tr><tr><td class="line">670</td><td class="hits"></td><td class="source"> * `chmod` Default to 0755. </td></tr><tr><td class="line">671</td><td class="hits"></td><td class="source"> * `cwd` Current working directory for relative paths. </td></tr><tr><td class="line">672</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">673</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">674</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">675</td><td class="hits"></td><td class="source"> * `err` Error object if any. </td></tr><tr><td class="line">676</td><td class="hits"></td><td class="source"> * `created` Number of created directories</td></tr><tr><td class="line">677</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">678</td><td class="hits"></td><td class="source"> Simple usage:</td></tr><tr><td class="line">679</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">680</td><td class="hits"></td><td class="source"> mecano.mkdir './some/dir', (err, created) -></td></tr><tr><td class="line">681</td><td class="hits"></td><td class="source"> console.log err?.message ? created</td></tr><tr><td class="line">682</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">683</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">684</td><td class="hits"></td><td class="source"> mkdir: function(options, callback) {</td></tr><tr class="hit"> <td class="line">685</td><td class="hits">38</td><td class="source"> var created;</td></tr><tr class="hit"> <td class="line">686</td><td class="hits">38</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">687</td><td class="hits">38</td><td class="source"> created = 0;</td></tr><tr class="hit"> <td class="line">688</td><td class="hits">38</td><td class="source"> return each(options).on('item', function(next, option) {</td></tr><tr class="hit"> <td class="line">689</td><td class="hits">39</td><td class="source"> var check, create, cwd, _ref1;</td></tr><tr class="hit"> <td class="line">690</td><td class="hits">39</td><td class="source"> if (typeof option === 'string') {</td></tr><tr class="hit"> <td class="line">691</td><td class="hits">34</td><td class="source"> option = {</td></tr><tr><td class="line">692</td><td class="hits"></td><td class="source"> source: option</td></tr><tr><td class="line">693</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">694</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">695</td><td class="hits">39</td><td class="source"> if (!(option.source != null) && (option.directory != null)) {</td></tr><tr class="hit"> <td class="line">696</td><td class="hits">5</td><td class="source"> option.source = option.directory;</td></tr><tr><td class="line">697</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">698</td><td class="hits">39</td><td class="source"> cwd = (_ref1 = option.cwd) != null ? _ref1 : process.cwd();</td></tr><tr class="hit"> <td class="line">699</td><td class="hits">39</td><td class="source"> option.source = path.resolve(cwd, option.source);</td></tr><tr class="hit"> <td class="line">700</td><td class="hits">39</td><td class="source"> if (option.source == null) {</td></tr><tr class="miss"> <td class="line">701</td><td class="hits">0</td><td class="source"> return next(new Error('Missing source option'));</td></tr><tr><td class="line">702</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">703</td><td class="hits">39</td><td class="source"> check = function() {</td></tr><tr class="hit"> <td class="line">704</td><td class="hits">39</td><td class="source"> return fs.stat(option.source, function(err, stat) {</td></tr><tr class="hit"> <td class="line">705</td><td class="hits">39</td><td class="source"> if (err && err.code === 'ENOENT') {</td></tr><tr class="hit"> <td class="line">706</td><td class="hits">31</td><td class="source"> return create();</td></tr><tr><td class="line">707</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">708</td><td class="hits">8</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">709</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">710</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">711</td><td class="hits">8</td><td class="source"> if (stat.isDirectory()) {</td></tr><tr class="hit"> <td class="line">712</td><td class="hits">8</td><td class="source"> return next();</td></tr><tr><td class="line">713</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">714</td><td class="hits">0</td><td class="source"> return next(err('Invalid source, got #{JSON.encode(option.source)}'));</td></tr><tr><td class="line">715</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">716</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">717</td><td class="hits">39</td><td class="source"> create = function() {</td></tr><tr class="hit"> <td class="line">718</td><td class="hits">31</td><td class="source"> var current, dirCreated, dirs, _ref2;</td></tr><tr class="hit"> <td class="line">719</td><td class="hits">31</td><td class="source"> if ((_ref2 = option.chmod) == null) {</td></tr><tr class="hit"> <td class="line">720</td><td class="hits">31</td><td class="source"> option.chmod = 0x1ed;</td></tr><tr><td class="line">721</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">722</td><td class="hits">31</td><td class="source"> current = '';</td></tr><tr class="hit"> <td class="line">723</td><td class="hits">31</td><td class="source"> dirCreated = false;</td></tr><tr class="hit"> <td class="line">724</td><td class="hits">31</td><td class="source"> dirs = option.source.split('/');</td></tr><tr class="hit"> <td class="line">725</td><td class="hits">31</td><td class="source"> return each(dirs).on('item', function(next, dir) {</td></tr><tr class="hit"> <td class="line">726</td><td class="hits">290</td><td class="source"> if ((option.exclude != null) && option.exclude instanceof RegExp) {</td></tr><tr class="hit"> <td class="line">727</td><td class="hits">12</td><td class="source"> if (option.exclude.test(dir)) {</td></tr><tr class="hit"> <td class="line">728</td><td class="hits">1</td><td class="source"> return next();</td></tr><tr><td class="line">729</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">730</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">731</td><td class="hits">289</td><td class="source"> current += "/" + dir;</td></tr><tr class="hit"> <td class="line">732</td><td class="hits">289</td><td class="source"> return fs.exists(current, function(exists) {</td></tr><tr class="hit"> <td class="line">733</td><td class="hits">289</td><td class="source"> if (exists) {</td></tr><tr class="hit"> <td class="line">734</td><td class="hits">255</td><td class="source"> return next();</td></tr><tr><td class="line">735</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">736</td><td class="hits">34</td><td class="source"> return fs.mkdir(current, option.chmod, function(err) {</td></tr><tr class="hit"> <td class="line">737</td><td class="hits">34</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">738</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">739</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">740</td><td class="hits">34</td><td class="source"> dirCreated = true;</td></tr><tr class="hit"> <td class="line">741</td><td class="hits">34</td><td class="source"> return next();</td></tr><tr><td class="line">742</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">743</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">744</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">745</td><td class="hits">31</td><td class="source"> if (dirCreated) {</td></tr><tr class="hit"> <td class="line">746</td><td class="hits">31</td><td class="source"> created++;</td></tr><tr><td class="line">747</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">748</td><td class="hits">31</td><td class="source"> return next(err);</td></tr><tr><td class="line">749</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">750</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">751</td><td class="hits">39</td><td class="source"> return check();</td></tr><tr><td class="line">752</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">753</td><td class="hits">38</td><td class="source"> return callback(err, created);</td></tr><tr><td class="line">754</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">755</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">756</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">757</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">758</td><td class="hits"></td><td class="source"> `rm` `remove(options, callback)`</td></tr><tr><td class="line">759</td><td class="hits"></td><td class="source"> --------------------------------</td></tr><tr><td class="line">760</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">761</td><td class="hits"></td><td class="source"> Recursively remove a file or directory. Internally, the function </td></tr><tr><td class="line">762</td><td class="hits"></td><td class="source"> use the [rimraf](https://github.com/isaacs/rimraf) library.</td></tr><tr><td class="line">763</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">764</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">765</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">766</td><td class="hits"></td><td class="source"> * `source` File or directory. </td></tr><tr><td class="line">767</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">768</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">769</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">770</td><td class="hits"></td><td class="source"> * `err` Error object if any. </td></tr><tr><td class="line">771</td><td class="hits"></td><td class="source"> * `deleted` Number of deleted sources. </td></tr><tr><td class="line">772</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">773</td><td class="hits"></td><td class="source"> Example</td></tr><tr><td class="line">774</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">775</td><td class="hits"></td><td class="source"> mecano.rm './some/dir', (err, removed) -></td></tr><tr><td class="line">776</td><td class="hits"></td><td class="source"> console.log "#{removed} dir removed"</td></tr><tr><td class="line">777</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">778</td><td class="hits"></td><td class="source"> Removing a directory unless a given file exists</td></tr><tr><td class="line">779</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">780</td><td class="hits"></td><td class="source"> mecano.rm</td></tr><tr><td class="line">781</td><td class="hits"></td><td class="source"> source: './some/dir'</td></tr><tr><td class="line">782</td><td class="hits"></td><td class="source"> not_if_exists: './some/file'</td></tr><tr><td class="line">783</td><td class="hits"></td><td class="source"> , (err, removed) -></td></tr><tr><td class="line">784</td><td class="hits"></td><td class="source"> console.log "#{removed} dir removed"</td></tr><tr><td class="line">785</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">786</td><td class="hits"></td><td class="source"> Removing multiple files and directories</td></tr><tr><td class="line">787</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">788</td><td class="hits"></td><td class="source"> mecano.rm [</td></tr><tr><td class="line">789</td><td class="hits"></td><td class="source"> { source: './some/dir', not_if_exists: './some/file' }</td></tr><tr><td class="line">790</td><td class="hits"></td><td class="source"> './some/file'</td></tr><tr><td class="line">791</td><td class="hits"></td><td class="source"> ], (err, removed) -></td></tr><tr><td class="line">792</td><td class="hits"></td><td class="source"> console.log "#{removed} dirs removed"</td></tr><tr><td class="line">793</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">794</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">795</td><td class="hits"></td><td class="source"> remove: function(options, callback) {</td></tr><tr class="hit"> <td class="line">796</td><td class="hits">26</td><td class="source"> var deleted;</td></tr><tr class="hit"> <td class="line">797</td><td class="hits">26</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">798</td><td class="hits">26</td><td class="source"> deleted = 0;</td></tr><tr class="hit"> <td class="line">799</td><td class="hits">26</td><td class="source"> return each(options).on('item', function(next, options) {</td></tr><tr class="hit"> <td class="line">800</td><td class="hits">26</td><td class="source"> if (typeof options === 'string') {</td></tr><tr class="hit"> <td class="line">801</td><td class="hits">25</td><td class="source"> options = {</td></tr><tr><td class="line">802</td><td class="hits"></td><td class="source"> source: options</td></tr><tr><td class="line">803</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">804</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">805</td><td class="hits">26</td><td class="source"> if (options.source == null) {</td></tr><tr class="miss"> <td class="line">806</td><td class="hits">0</td><td class="source"> return next(new Error('Missing source: #{option.source}'));</td></tr><tr><td class="line">807</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">808</td><td class="hits">26</td><td class="source"> return fs.lstat(options.source, function(err, stat) {</td></tr><tr class="hit"> <td class="line">809</td><td class="hits">26</td><td class="source"> var _ref1;</td></tr><tr class="hit"> <td class="line">810</td><td class="hits">26</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">811</td><td class="hits">0</td><td class="source"> return next();</td></tr><tr><td class="line">812</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">813</td><td class="hits">26</td><td class="source"> if ((_ref1 = options.options) == null) {</td></tr><tr class="hit"> <td class="line">814</td><td class="hits">26</td><td class="source"> options.options = {};</td></tr><tr><td class="line">815</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">816</td><td class="hits">26</td><td class="source"> return rimraf(options.source, function(err) {</td></tr><tr class="hit"> <td class="line">817</td><td class="hits">26</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">818</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">819</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">820</td><td class="hits">26</td><td class="source"> deleted++;</td></tr><tr class="hit"> <td class="line">821</td><td class="hits">26</td><td class="source"> return next();</td></tr><tr><td class="line">822</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">823</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">824</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">825</td><td class="hits">26</td><td class="source"> return callback(err, deleted);</td></tr><tr><td class="line">826</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">827</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">828</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">829</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">830</td><td class="hits"></td><td class="source"> `render(options, callback)`</td></tr><tr><td class="line">831</td><td class="hits"></td><td class="source"> ---------------------------</td></tr><tr><td class="line">832</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">833</td><td class="hits"></td><td class="source"> Render a template file At the moment, only the </td></tr><tr><td class="line">834</td><td class="hits"></td><td class="source"> [ECO](http://github.com/sstephenson/eco) templating engine is integrated.</td></tr><tr><td class="line">835</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">836</td><td class="hits"></td><td class="source"> `options` Command options include: </td></tr><tr><td class="line">837</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">838</td><td class="hits"></td><td class="source"> * `engine` Template engine to use, default to "eco"</td></tr><tr><td class="line">839</td><td class="hits"></td><td class="source"> * `content` Templated content, bypassed if source is provided.</td></tr><tr><td class="line">840</td><td class="hits"></td><td class="source"> * `source` File path where to extract content from.</td></tr><tr><td class="line">841</td><td class="hits"></td><td class="source"> * `destination` File path where to write content to.</td></tr><tr><td class="line">842</td><td class="hits"></td><td class="source"> * `context` Map of key values to inject into the template.</td></tr><tr><td class="line">843</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">844</td><td class="hits"></td><td class="source"> `callback` Received parameters are: </td></tr><tr><td class="line">845</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">846</td><td class="hits"></td><td class="source"> * `err` Error object if any. </td></tr><tr><td class="line">847</td><td class="hits"></td><td class="source"> * `rendered` Number of rendered files.</td></tr><tr><td class="line">848</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">849</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">850</td><td class="hits"></td><td class="source"> render: function(options, callback) {</td></tr><tr class="hit"> <td class="line">851</td><td class="hits">3</td><td class="source"> var rendered;</td></tr><tr class="hit"> <td class="line">852</td><td class="hits">3</td><td class="source"> options = misc.options(options);</td></tr><tr class="hit"> <td class="line">853</td><td class="hits">3</td><td class="source"> rendered = 0;</td></tr><tr class="hit"> <td class="line">854</td><td class="hits">3</td><td class="source"> return each(options).on('item', function(next, option) {</td></tr><tr class="hit"> <td class="line">855</td><td class="hits">3</td><td class="source"> var readSource, writeContent;</td></tr><tr class="hit"> <td class="line">856</td><td class="hits">3</td><td class="source"> if (!(option.source || option.content)) {</td></tr><tr class="miss"> <td class="line">857</td><td class="hits">0</td><td class="source"> return next(new Error('Missing source or content'));</td></tr><tr><td class="line">858</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">859</td><td class="hits">3</td><td class="source"> if (!option.destination) {</td></tr><tr class="miss"> <td class="line">860</td><td class="hits">0</td><td class="source"> return next(new Error('Missing destination'));</td></tr><tr><td class="line">861</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">862</td><td class="hits">3</td><td class="source"> readSource = function() {</td></tr><tr class="hit"> <td class="line">863</td><td class="hits">3</td><td class="source"> if (!option.source) {</td></tr><tr class="hit"> <td class="line">864</td><td class="hits">1</td><td class="source"> return writeContent();</td></tr><tr><td class="line">865</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">866</td><td class="hits">2</td><td class="source"> return fs.exists(option.source, function(exists) {</td></tr><tr class="hit"> <td class="line">867</td><td class="hits">2</td><td class="source"> if (!exists) {</td></tr><tr class="hit"> <td class="line">868</td><td class="hits">1</td><td class="source"> return next(new Error("Invalid source, got " + (JSON.stringify(option.source))));</td></tr><tr><td class="line">869</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">870</td><td class="hits">1</td><td class="source"> return fs.readFile(option.source, function(err, content) {</td></tr><tr class="hit"> <td class="line">871</td><td class="hits">1</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">872</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">873</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">874</td><td class="hits">1</td><td class="source"> option.content = content;</td></tr><tr class="hit"> <td class="line">875</td><td class="hits">1</td><td class="source"> return writeContent();</td></tr><tr><td class="line">876</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">877</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">878</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">879</td><td class="hits">3</td><td class="source"> writeContent = function() {</td></tr><tr class="hit"> <td class="line">880</td><td class="hits">2</td><td class="source"> var content;</td></tr><tr class="hit"> <td class="line">881</td><td class="hits">2</td><td class="source"> try {</td></tr><tr class="hit"> <td class="line">882</td><td class="hits">2</td><td class="source"> content = eco.render(option.content.toString(), option.context || {});</td></tr><tr><td class="line">883</td><td class="hits"></td><td class="source"> } catch (err) {</td></tr><tr class="miss"> <td class="line">884</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">885</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">886</td><td class="hits">2</td><td class="source"> return fs.writeFile(option.destination, content, function(err) {</td></tr><tr class="hit"> <td class="line">887</td><td class="hits">2</td><td class="source"> if (err) {</td></tr><tr class="miss"> <td class="line">888</td><td class="hits">0</td><td class="source"> return next(err);</td></tr><tr><td class="line">889</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">890</td><td class="hits">2</td><td class="source"> rendered++;</td></tr><tr class="hit"> <td class="line">891</td><td class="hits">2</td><td class="source"> return next();</td></tr><tr><td class="line">892</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">893</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"> <td class="line">894</td><td class="hits">3</td><td class="source"> return readSource();</td></tr><tr><td class="line">895</td><td class="hits"></td><td class="source"> }).on('both', function(err) {</td></tr><tr class="hit"> <td class="line">896</td><td class="hits">3</td><td class="source"> return callback(err, rendered);</td></tr><tr><td class="line">897</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">898</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">899</td><td class="hits"></td><td class="source">};</td></tr><tr><td class="line">900</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">901</td><td class="hits">1</td><td class="source">mecano.cp = mecano.copy;</td></tr><tr><td class="line">902</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">903</td><td class="hits">1</td><td class="source">mecano.exec = mecano.execute;</td></tr><tr><td class="line">904</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">905</td><td class="hits">1</td><td class="source">mecano.ln = mecano.link;</td></tr><tr><td class="line">906</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">907</td><td class="hits">1</td><td class="source">mecano.rm = mecano.remove;</td></tr></tbody></table></div><div class="file"><h2 id="misc.js">misc.js</h2><div id="stats" class="medium"><div class="percentage">73%</div><div class="sloc">46</div><div class="hits">34</div><div class="misses">12</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr><td class="line">1</td><td class="hits"></td><td class="source">// Generated by CoffeeScript 1.4.0</td></tr><tr><td class="line">2</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"> <td class="line">3</td><td class="hits">1</td><td class="source">module.exports = {</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> `isPortOpen(port, host, callback)`: Check if a port is already open</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> isPortOpen: function(port, host, callback) {</td></tr><tr class="miss"> <td class="line">9</td><td class="hits">0</td><td class="source"> if (arguments.length === 2) {</td></tr><tr class="miss"> <td class="line">10</td><td class="hits">0</td><td class="source"> callback = host;</td></tr><tr class="miss"> <td class="line">11</td><td class="hits">0</td><td class="source"> host = '127.0.0.1';</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">13</td><td class="hits">0</td><td class="source"> return exec("nc " + host + " " + port + " < /dev/null", function(err, stdout, stderr) {</td></tr><tr class="miss"> <td class="line">14</td><td class="hits">0</td><td class="source"> if (!err) {</td></tr><tr class="miss"> <td class="line">15</td><td class="hits">0</td><td class="source"> return callback(null, true);</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">17</td><td class="hits">0</td><td class="source"> if (err.code === 1) {</td></tr><tr class="miss"> <td class="line">18</td><td class="hits">0</td><td class="source"> return callback(null, false);</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"> <td class="line">20</td><td class="hits">0</td><td class="source"> return callback(err);</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> `merge([inverse], obj1, obj2, ...]`: Recursively merge objects</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> --------------------------------------------------------------</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> On matching keys, the last object take precedence over previous ones </td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> unless the inverse arguments is provided as true. Only objects are </td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> merge, arrays are overwritten.</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> Enrich an existing object with a second one:</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> obj1 = { a_key: 'a value', b_key: 'b value'}</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> obj2 = { b_key: 'new b value'}</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> result = misc.merge obj1, obj2</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> assert.eql result, obj1</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> assert.eql obj1.b_key, 'new b value'</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> Create a new object from two objects:</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> obj1 = { a_key: 'a value', b_key: 'b value'}</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> obj2 = { b_key: 'new b value'}</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> result = misc.merge {}, obj1, obj2</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> assert.eql result.b_key, 'new b value'</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> Using inverse:</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> obj1 = { b_key: 'b value'}</td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source"> obj2 = { a_key: 'a value', b_key: 'new b value'}</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> misc.merge true, obj1, obj2</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> assert.eql obj1.a_key, 'a value'</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> assert.eql obj1.b_key, 'b value'</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> merge: function() {</td></tr><tr class="hit"> <td class="line">52</td><td class="hits">25</td><td class="source"> var clone, copy, from, i, inverse, name, options, src, target, to, _i;</td></tr><tr class="hit"> <td class="line">53</td><td class="hits">25</td><td class="source"> target = arguments[0];</td></tr><tr class="hit"> <td class="line">54</td><td class="hits">25</td><td class="source"> from = 1;</td></tr><tr class="hit"> <td class="line">55</td><td class="hits">25</td><td class="source"> to = arguments.length;</td></tr><tr class="hit"> <td class="line">56</td><td class="hits">25</td><td class="source"> if (typeof target === 'boolean') {</td></tr><tr class="hit"> <td class="line">57</td><td class="hits">22</td><td class="source"> inverse = !!target;</td></tr><tr class="hit"> <td class="line">58</td><td class="hits">22</td><td class="source"> target = arguments[1];</td></tr><tr class="hit"> <td class="line">59</td><td class="hits">22</td><td class="source"> from = 2;</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">61</td><td class="hits">25</td><td class="source"> if (typeof target !== "object" && typeof target !== 'function') {</td></tr><tr class="miss"> <td class="line">62</td><td class="hits">0</td><td class="source"> target = {};</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">64</td><td class="hits">25</td><td class="source"> for (i = _i = from; from <= to ? _i < to : _i > to; i = from <= to ? ++_i : --_i) {</td></tr><tr class="hit"> <td class="line">65</td><td class="hits">26</td><td class="source"> if ((options = arguments[i]) !== null) {</td></tr><tr class="hit"> <td class="line">66</td><td class="hits">26</td><td class="source"> for (name in options) {</td></tr><tr class="hit"> <td class="line">67</td><td class="hits">58</td><td class="source"> src = target[name];</td></tr><tr class="hit"> <td class="line">68</td><td class="hits">58</td><td class="source"> copy = options[name];</td></tr><tr class="hit"> <td class="line">69</td><td class="hits">58</td><td class="source"> if (target === copy) {</td></tr><tr class="miss"> <td class="line">70</td><td class="hits">0</td><td class="source"> continue;</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">72</td><td class="hits">58</td><td class="source"> if ((copy != null) && typeof copy === 'object' && !Array.isArray(copy)) {</td></tr><tr class="hit"> <td class="line">73</td><td class="hits">2</td><td class="source"> clone = src && (src && typeof src === 'object' ? src : {});</td></tr><tr class="hit"> <td class="line">74</td><td class="hits">2</td><td class="source"> target[name] = this.merge(false, clone, copy);</td></tr><tr class="hit"> <td class="line">75</td><td class="hits">56</td><td class="source"> } else if (copy !== void 0) {</td></tr><tr class="hit"> <td class="line">76</td><td class="hits">56</td><td class="source"> if (!(inverse && typeof target[name] !== 'undefined')) {</td></tr><tr class="hit"> <td class="line">77</td><td class="hits">21</td><td class="source"> target[name] = copy;</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">83</td><td class="hits">25</td><td class="source"> return target;</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> /*</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> `options(options)` Normalize options</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> */</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> options: function(options) {</td></tr><tr class="hit"> <td class="line">90</td><td class="hits">121</td><td class="source"> var option, _i, _len;</td></tr><tr class="hit"> <td class="line">91</td><td class="hits">121</td><td class="source"> if (!Array.isArray(options)) {</td></tr><tr class="hit"> <td class="line">92</td><td class="hits">112</td><td class="source"> options = [options];</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">94</td><td class="hits">121</td><td class="source"> for (_i = 0, _len = options.length; _i < _len; _i++) {</td></tr><tr class="hit"> <td class="line">95</td><td class="hits">123</td><td class="source"> option = options[_i];</td></tr><tr class="hit"> <td class="line">96</td><td class="hits">123</td><td class="source"> if ((option["if"] != null) && !Array.isArray(option["if"])) {</td></tr><tr class="miss"> <td class="line">97</td><td class="hits">0</td><td class="source"> option["if"] = [option["if"]];</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">99</td><td class="hits">123</td><td class="source"> if ((option.if_exists != null) && !Array.isArray(option.if_exists)) {</td></tr><tr class="hit"> <td class="line">100</td><td class="hits">2</td><td class="source"> option.if_exists = [option.if_exists];</td></tr><tr><td class="line">101</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">102</td><td class="hits">123</td><td class="source"> if ((option.not_if_exists != null) && !Array.isArray(option.not_if_exists)) {</td></tr><tr class="hit"> <td class="line">103</td><td class="hits">1</td><td class="source"> option.not_if_exists = [option.not_if_exists];</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"> <td class="line">106</td><td class="hits">121</td><td class="source"> return options;</td></tr><tr><td class="line">107</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source">};</td></tr></tbody></table></div></div></div></body></html> |