Index: Dev/trunk/node_modules/grunt-exec/.travis.yml
===================================================================
--- Dev/trunk/node_modules/grunt-exec/.travis.yml	(revision 484)
+++ Dev/trunk/node_modules/grunt-exec/.travis.yml	(revision 516)
@@ -1,3 +1,4 @@
 language: node_js
 node_js:
-  - 0.8
+  - "0.8"
+  - "0.10"
Index: Dev/trunk/node_modules/grunt-exec/Gruntfile.js
===================================================================
--- Dev/trunk/node_modules/grunt-exec/Gruntfile.js	(revision 484)
+++ Dev/trunk/node_modules/grunt-exec/Gruntfile.js	(revision 516)
@@ -10,4 +10,5 @@
         cmd: 'ls -l **'
       }
+    , list_all_files: 'ls -la'
     , echo_grunt_version: {
         cmd: function() { return 'echo ' + this.version; }
Index: Dev/trunk/node_modules/grunt-exec/README.md
===================================================================
--- Dev/trunk/node_modules/grunt-exec/README.md	(revision 484)
+++ Dev/trunk/node_modules/grunt-exec/README.md	(revision 516)
@@ -23,26 +23,46 @@
 -----
 
-This plugin is a [multi task][types_of_tasks], meaning that grunt will automatically iterate over all exec targets if a target is not specified.
+This plugin is a [multi task][types_of_tasks], meaning that grunt will 
+automatically iterate over all exec targets if a target is not specified.
 
-If the exit code generated by the specified shell command is greater than 0, grunt-exec will assume an error has occurred and will abort grunt immediately.
+If the exit code generated by the specified shell command is greater than 0, 
+grunt-exec will assume an error has occurred and will abort grunt immediately.
 
-[types_of_tasks]: https://github.com/gruntjs/grunt/blob/master/docs/types_of_tasks.md#multi-tasks
+[types_of_tasks]: http://gruntjs.com/configuring-tasks#task-configuration-and-targets
 
 ### Properties
 
-*   __command__: The shell command to be executed. Must be a string or a function that returns a string. (alias: __cmd__)
-*   __stdout__: If `true`, stdout will be printed. Defaults to `true`.
-*   __stderr__: If `true`, stderr will be printed. Defaults to `true`.
-*   __cwd__: Current working directory of the shell command. Defaults to the directory containing your Gruntfile.
-*   __exitCode__: The expected exit code, task will fail if the actual exit code doesn't match. Defaults to `0`.
-*   __callback__: The callback function passed `child_process.exec`. Defaults to a noop.
+*  __command__ (alias: __cmd__): The shell command to be executed. Must be a 
+  string or a function that returns a string.
+*  __stdout__: If `true`, stdout will be printed. Defaults to `true`.
+*  __stderr__: If `true`, stderr will be printed. Defaults to `true`.
+*  __cwd__: Current working directory of the shell command. Defaults to the 
+  directory containing your Gruntfile.
+*  __exitCode__ (alias: __exitCodes__): The expected exit code(s), task will 
+  fail if the actual exit code doesn't match. Defaults to `0`. Can be an array 
+  for multiple allowed exit codes.
+*  __callback__: The callback function passed `child_process.exec`. Defaults to 
+  a noop.
+
+If the configuration is instead a simple `string`, it will be
+interpreted as a full command itself:
+
+```javascript
+exec: {
+  echo_something: 'echo "This is something"'
+}
+```
 
 ### Command Functions
 
-If you plan on doing advanced stuff with grunt-exec, you'll most likely be using functions for the `command` property of your exec targets. This section details a couple of helpful tips about command functions that could help make your life easier.
+If you plan on doing advanced stuff with grunt-exec, you'll most likely be using 
+functions for the `command` property of your exec targets. This section details 
+a couple of helpful tips about command functions that could help make your life 
+easier.
 
 #### Passing arguments from the command line
 
-Command functions can be called with arbitrary arguments. Let's say we have the following exec target that echoes a formatted name:
+Command functions can be called with arbitrary arguments. Let's say we have the 
+following exec target that echoes a formatted name:
 
 ```javascript
@@ -61,9 +81,11 @@
 ```
 
-In order to get `SIMPSON, HOMER` echoed, you'd run `grunt exec:echo_name:homer:simpson` from the command line.
+In order to get `SIMPSON, HOMER` echoed, you'd run 
+`grunt exec:echo_name:homer:simpson` from the command line.
 
 ### Accessing `grunt` object
 
-All command functions are called in the context of the `grunt` object that they are being ran with. This means you can access the `grunt` object through `this`.
+All command functions are called in the context of the `grunt` object that they 
+are being ran with. This means you can access the `grunt` object through `this`.
 
 ### Example
@@ -82,4 +104,5 @@
       cmd: 'ls -l **'
     },
+    list_all_files: 'ls -la',
     echo_grunt_version: {
       cmd: function() { return 'echo ' + this.version; }
@@ -117,5 +140,6 @@
 ----------
 
-For transparency and insight into the release cycle, releases will be numbered with the follow format:
+For transparency and insight into the release cycle, releases will be numbered 
+with the follow format:
 
 `<major>.<minor>.<patch>`
Index: Dev/trunk/node_modules/grunt-exec/package.json
===================================================================
--- Dev/trunk/node_modules/grunt-exec/package.json	(revision 484)
+++ Dev/trunk/node_modules/grunt-exec/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "grunt-exec",
   "description": "Grunt task for executing shell commands.",
-  "version": "0.4.2",
+  "version": "0.4.5",
   "homepage": "https://github.com/jharding/grunt-exec",
   "author": {
@@ -40,11 +40,11 @@
     "shell"
   ],
-  "readme": "[![build status](https://secure.travis-ci.org/jharding/grunt-exec.png?branch=master)](http://travis-ci.org/jharding/grunt-exec)\ngrunt-exec\n==========\n\nGrunt plugin for executing shell commands.\n\nInstallation\n------------\n\nInstall grunt-exec using npm:\n\n```\n$ npm install grunt-exec\n```\n\nThen add this line to your project's *Gruntfile.js*:\n\n```javascript\ngrunt.loadNpmTasks('grunt-exec');\n```\n\nUsage\n-----\n\nThis plugin is a [multi task][types_of_tasks], meaning that grunt will automatically iterate over all exec targets if a target is not specified.\n\nIf the exit code generated by the specified shell command is greater than 0, grunt-exec will assume an error has occurred and will abort grunt immediately.\n\n[types_of_tasks]: https://github.com/gruntjs/grunt/blob/master/docs/types_of_tasks.md#multi-tasks\n\n### Properties\n\n*   __command__: The shell command to be executed. Must be a string or a function that returns a string. (alias: __cmd__)\n*   __stdout__: If `true`, stdout will be printed. Defaults to `true`.\n*   __stderr__: If `true`, stderr will be printed. Defaults to `true`.\n*   __cwd__: Current working directory of the shell command. Defaults to the directory containing your Gruntfile.\n*   __exitCode__: The expected exit code, task will fail if the actual exit code doesn't match. Defaults to `0`.\n*   __callback__: The callback function passed `child_process.exec`. Defaults to a noop.\n\n### Command Functions\n\nIf you plan on doing advanced stuff with grunt-exec, you'll most likely be using functions for the `command` property of your exec targets. This section details a couple of helpful tips about command functions that could help make your life easier.\n\n#### Passing arguments from the command line\n\nCommand functions can be called with arbitrary arguments. Let's say we have the following exec target that echoes a formatted name:\n\n```javascript\nexec: {\n  echo_name: {\n    cmd: function(firstName, lastName) {\n      var formattedName = [\n        lastName.toUpperCase(),\n        firstName.toUpperCase()\n      ].join(', ');\n\n      return 'echo ' + formattedName;\n    }\n  }\n}\n```\n\nIn order to get `SIMPSON, HOMER` echoed, you'd run `grunt exec:echo_name:homer:simpson` from the command line.\n\n### Accessing `grunt` object\n\nAll command functions are called in the context of the `grunt` object that they are being ran with. This means you can access the `grunt` object through `this`.\n\n### Example\n\nThe following examples are available in grunt-exec's Gruntfile.\n\n```javascript\ngrunt.initConfig({\n  exec: {\n    remove_logs: {\n      command: 'rm -f *.log',\n      stdout: false,\n      stderr: false\n    },\n    list_files: {\n      cmd: 'ls -l **'\n    },\n    echo_grunt_version: {\n      cmd: function() { return 'echo ' + this.version; }\n    },\n    echo_name: {\n      cmd: function(firstName, lastName) {\n        var formattedName = [\n          lastName.toUpperCase(),\n          firstName.toUpperCase()\n        ].join(', ');\n\n        return 'echo ' + formattedName;\n      }\n    }\n  }\n});\n```\n\nTesting\n-------\n\n```\n$ cd grunt-exec\n$ npm test\n```\n\nIssues\n------\n\nFound a bug? Create an issue on GitHub.\n\nhttps://github.com/jharding/grunt-exec/issues\n\nVersioning\n----------\n\nFor transparency and insight into the release cycle, releases will be numbered with the follow format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backwards compatibility bumps the major\n* New additions without breaking backwards compatibility bumps the minor\n* Bug fixes and misc changes bump the patch\n\nFor more information on semantic versioning, please visit http://semver.org/.\n\nLicense\n-------\n\nCopyright (c) 2012 [Jake Harding](http://thejakeharding.com)  \nLicensed under the MIT License.\n",
+  "readme": "[![build status](https://secure.travis-ci.org/jharding/grunt-exec.png?branch=master)](http://travis-ci.org/jharding/grunt-exec)\ngrunt-exec\n==========\n\nGrunt plugin for executing shell commands.\n\nInstallation\n------------\n\nInstall grunt-exec using npm:\n\n```\n$ npm install grunt-exec\n```\n\nThen add this line to your project's *Gruntfile.js*:\n\n```javascript\ngrunt.loadNpmTasks('grunt-exec');\n```\n\nUsage\n-----\n\nThis plugin is a [multi task][types_of_tasks], meaning that grunt will \nautomatically iterate over all exec targets if a target is not specified.\n\nIf the exit code generated by the specified shell command is greater than 0, \ngrunt-exec will assume an error has occurred and will abort grunt immediately.\n\n[types_of_tasks]: http://gruntjs.com/configuring-tasks#task-configuration-and-targets\n\n### Properties\n\n*  __command__ (alias: __cmd__): The shell command to be executed. Must be a \n  string or a function that returns a string.\n*  __stdout__: If `true`, stdout will be printed. Defaults to `true`.\n*  __stderr__: If `true`, stderr will be printed. Defaults to `true`.\n*  __cwd__: Current working directory of the shell command. Defaults to the \n  directory containing your Gruntfile.\n*  __exitCode__ (alias: __exitCodes__): The expected exit code(s), task will \n  fail if the actual exit code doesn't match. Defaults to `0`. Can be an array \n  for multiple allowed exit codes.\n*  __callback__: The callback function passed `child_process.exec`. Defaults to \n  a noop.\n\nIf the configuration is instead a simple `string`, it will be\ninterpreted as a full command itself:\n\n```javascript\nexec: {\n  echo_something: 'echo \"This is something\"'\n}\n```\n\n### Command Functions\n\nIf you plan on doing advanced stuff with grunt-exec, you'll most likely be using \nfunctions for the `command` property of your exec targets. This section details \na couple of helpful tips about command functions that could help make your life \neasier.\n\n#### Passing arguments from the command line\n\nCommand functions can be called with arbitrary arguments. Let's say we have the \nfollowing exec target that echoes a formatted name:\n\n```javascript\nexec: {\n  echo_name: {\n    cmd: function(firstName, lastName) {\n      var formattedName = [\n        lastName.toUpperCase(),\n        firstName.toUpperCase()\n      ].join(', ');\n\n      return 'echo ' + formattedName;\n    }\n  }\n}\n```\n\nIn order to get `SIMPSON, HOMER` echoed, you'd run \n`grunt exec:echo_name:homer:simpson` from the command line.\n\n### Accessing `grunt` object\n\nAll command functions are called in the context of the `grunt` object that they \nare being ran with. This means you can access the `grunt` object through `this`.\n\n### Example\n\nThe following examples are available in grunt-exec's Gruntfile.\n\n```javascript\ngrunt.initConfig({\n  exec: {\n    remove_logs: {\n      command: 'rm -f *.log',\n      stdout: false,\n      stderr: false\n    },\n    list_files: {\n      cmd: 'ls -l **'\n    },\n    list_all_files: 'ls -la',\n    echo_grunt_version: {\n      cmd: function() { return 'echo ' + this.version; }\n    },\n    echo_name: {\n      cmd: function(firstName, lastName) {\n        var formattedName = [\n          lastName.toUpperCase(),\n          firstName.toUpperCase()\n        ].join(', ');\n\n        return 'echo ' + formattedName;\n      }\n    }\n  }\n});\n```\n\nTesting\n-------\n\n```\n$ cd grunt-exec\n$ npm test\n```\n\nIssues\n------\n\nFound a bug? Create an issue on GitHub.\n\nhttps://github.com/jharding/grunt-exec/issues\n\nVersioning\n----------\n\nFor transparency and insight into the release cycle, releases will be numbered \nwith the follow format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backwards compatibility bumps the major\n* New additions without breaking backwards compatibility bumps the minor\n* Bug fixes and misc changes bump the patch\n\nFor more information on semantic versioning, please visit http://semver.org/.\n\nLicense\n-------\n\nCopyright (c) 2012 [Jake Harding](http://thejakeharding.com)  \nLicensed under the MIT License.\n",
   "readmeFilename": "README.md",
-  "_id": "grunt-exec@0.4.2",
+  "_id": "grunt-exec@0.4.5",
   "dist": {
-    "shasum": "021f0dddaeef00cc4d83dff9d0d8c47a64917dbd"
+    "shasum": "2848b5f9ed0a096b459a637aad35cc89098b7958"
   },
-  "_from": "grunt-exec@0.4.2",
-  "_resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.2.tgz"
+  "_from": "grunt-exec@0.4.5",
+  "_resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.5.tgz"
 }
Index: Dev/trunk/node_modules/grunt-exec/tasks/exec.js
===================================================================
--- Dev/trunk/node_modules/grunt-exec/tasks/exec.js	(revision 484)
+++ Dev/trunk/node_modules/grunt-exec/tasks/exec.js	(revision 516)
@@ -18,5 +18,5 @@
       , stderr = data.stderr !== undefined ? data.stderr : true
       , callback = _.isFunction(data.callback) ? data.callback : function() {}
-      , exitCode = data.exitCode || 0
+      , exitCodes = data.exitCode || data.exitCodes || 0
       , command
       , childProcess
@@ -24,7 +24,10 @@
       , done = this.async();
 
+    // https://github.com/jharding/grunt-exec/pull/30
+    exitCodes = _.isArray(exitCodes) ? exitCodes : [exitCodes];
+
     // allow for command to be specified in either
-    // 'command' or 'cmd' property
-    command = data.command || data.cmd;
+    // 'command' or 'cmd' property, or as a string.
+    command = data.command || data.cmd || (_.isString(data) && data);
 
     data.cwd && (execOptions.cwd = data.cwd);
@@ -46,5 +49,5 @@
 
     verbose.subhead(command);
-    verbose.writeln(f('Expecting exit code %d', exitCode));
+    verbose.writeln(f('Expecting exit code %s', exitCodes.join(' or ')));
 
     childProcess = cp.exec(command, execOptions, callback);
@@ -54,5 +57,5 @@
 
     childProcess.on('exit', function(code) {
-      if (code !== exitCode) {
+      if (exitCodes.indexOf(code) < 0) {
         log.error(f('Exited with code: %d.', code));
         return done(false);
Index: Dev/trunk/node_modules/grunt-exec/test/Gruntfile.js
===================================================================
--- Dev/trunk/node_modules/grunt-exec/test/Gruntfile.js	(revision 484)
+++ Dev/trunk/node_modules/grunt-exec/test/Gruntfile.js	(revision 516)
@@ -21,13 +21,23 @@
         cmd: function(){
           return 'echo "you can use callback, and error, stdout, stderr can be used as arguments"';
-        },
-        callback: function(error, stdout, stderr){
-          var fs = require('fs');
-          var path = require('path');
-          var outputPath = path.resolve(process.cwd(), 'test4');
+        }
+      , callback: function(error, stdout, stderr){
+          var fs = require('fs')
+            , path = require('path')
+            , outputPath = path.resolve(process.cwd(), 'test4');
+
           console.log('outputPath : ' + outputPath);
           fs.writeFileSync(outputPath, stdout, 'utf-8');
         }
       }
+    , test5: {
+        cmd: 'exit 8'
+      , exitCodes: 8
+      }
+    , test6: {
+        cmd: 'exit 9'
+      , exitCodes: [8, 9]
+      }
+    , test7: 'echo "you don\'t even need an object" > test7'
     }
   });
Index: Dev/trunk/node_modules/grunt-exec/test/test.js
===================================================================
--- Dev/trunk/node_modules/grunt-exec/test/test.js	(revision 484)
+++ Dev/trunk/node_modules/grunt-exec/test/test.js	(revision 516)
@@ -5,5 +5,13 @@
   , testDir = path.join(process.cwd(), 'test')
   , opts = { gruntfile: path.join(testDir, 'Gruntfile.js') }
-  , tasks = ['exec:test1', 'exec:test2', 'exec:test3:42:love', 'exec:test4'];
+  , tasks = [
+      'exec:test1'
+    , 'exec:test2'
+    , 'exec:test3:42:love'
+    , 'exec:test4'
+    , 'exec:test5'
+    , 'exec:test6'
+    , 'exec:test7'
+    ];
 
 grunt.tasks(tasks, opts, function() {
@@ -21,4 +29,5 @@
         , expected:'you can use callback, and error, stdout, stderr can be used as arguments\n'
         }
+      , { name: 'test7', expected: 'you don\'t even need an object\n' }
       ]
     , outputPath;
