2010-03-06 20:18:50 -05:00
|
|
|
# `cake` is a simplified version of [Make](http://www.gnu.org/software/make/)
|
|
|
|
# ([Rake](http://rake.rubyforge.org/), [Jake](http://github.com/280north/jake))
|
|
|
|
# for CoffeeScript. You define tasks with names and descriptions in a Cakefile,
|
|
|
|
# and can call them from the command line, or invoke them from other tasks.
|
|
|
|
#
|
|
|
|
# Running `cake` with no arguments will print out a list of all the tasks in the
|
|
|
|
# current directory's Cakefile.
|
2010-02-16 20:42:10 -05:00
|
|
|
|
2010-03-06 20:18:50 -05:00
|
|
|
# External dependencies.
|
2010-03-07 22:17:45 -05:00
|
|
|
fs: require 'fs'
|
|
|
|
path: require 'path'
|
2010-03-16 01:53:25 -04:00
|
|
|
helpers: require('./helpers').helpers
|
2010-03-15 23:39:46 -04:00
|
|
|
optparse: require './optparse'
|
|
|
|
CoffeeScript: require './coffee-script'
|
2010-02-16 20:42:10 -05:00
|
|
|
|
2010-03-06 20:18:50 -05:00
|
|
|
# Keep track of the list of defined tasks, the accepted options, and so on.
|
2010-02-16 20:42:10 -05:00
|
|
|
tasks: {}
|
2010-02-25 21:43:42 -05:00
|
|
|
options: {}
|
|
|
|
switches: []
|
|
|
|
oparse: null
|
2010-02-16 20:42:10 -05:00
|
|
|
|
2010-03-06 20:18:50 -05:00
|
|
|
# Mixin the top-level Cake functions for Cakefiles to use directly.
|
2010-03-16 01:53:25 -04:00
|
|
|
helpers.extend global, {
|
2010-02-16 20:42:10 -05:00
|
|
|
|
2010-03-26 05:25:17 -04:00
|
|
|
# Define a Cake task with a short name, an optional sentence description,
|
2010-03-06 20:18:50 -05:00
|
|
|
# and the function to run as the action itself.
|
2010-02-16 20:42:10 -05:00
|
|
|
task: (name, description, action) ->
|
2010-04-04 00:20:17 -04:00
|
|
|
[action, description]: [description, action] unless action
|
2010-02-16 20:42:10 -05:00
|
|
|
tasks[name]: {name: name, description: description, action: action}
|
|
|
|
|
2010-03-06 20:18:50 -05:00
|
|
|
# Define an option that the Cakefile accepts. The parsed options hash,
|
|
|
|
# containing all of the command-line options passed, will be made available
|
|
|
|
# as the first argument to the action.
|
2010-02-25 21:43:42 -05:00
|
|
|
option: (letter, flag, description) ->
|
|
|
|
switches.push [letter, flag, description]
|
|
|
|
|
2010-03-06 20:18:50 -05:00
|
|
|
# Invoke another task in the current Cakefile.
|
2010-02-16 20:42:10 -05:00
|
|
|
invoke: (name) ->
|
2010-02-17 20:37:30 -05:00
|
|
|
no_such_task name unless tasks[name]
|
2010-03-06 20:18:50 -05:00
|
|
|
tasks[name].action options
|
2010-02-25 21:43:42 -05:00
|
|
|
|
2010-02-16 20:42:10 -05:00
|
|
|
}
|
|
|
|
|
2010-03-06 20:18:50 -05:00
|
|
|
# Run `cake`. Executes all of the tasks you pass, in order. Note that Node's
|
|
|
|
# asynchrony may cause tasks to execute in a different order than you'd expect.
|
|
|
|
# If no tasks are passed, print the help screen.
|
2010-02-16 20:42:10 -05:00
|
|
|
exports.run: ->
|
|
|
|
path.exists 'Cakefile', (exists) ->
|
2010-03-06 13:59:11 -05:00
|
|
|
throw new Error("Cakefile not found in ${process.cwd()}") unless exists
|
2010-03-07 13:41:15 -05:00
|
|
|
args: process.argv[2...process.argv.length]
|
2010-05-15 00:34:14 -04:00
|
|
|
CoffeeScript.run fs.readFileSync('Cakefile').toString(), {source: 'Cakefile'}
|
2010-02-25 21:53:42 -05:00
|
|
|
oparse: new optparse.OptionParser switches
|
|
|
|
return print_tasks() unless args.length
|
|
|
|
options: oparse.parse(args)
|
|
|
|
invoke arg for arg in options.arguments
|
2010-02-16 20:42:10 -05:00
|
|
|
|
2010-03-06 20:18:50 -05:00
|
|
|
# Display the list of Cake tasks in a format similar to `rake -T`
|
2010-02-25 01:17:43 -05:00
|
|
|
print_tasks: ->
|
2010-02-25 21:43:42 -05:00
|
|
|
puts ''
|
2010-02-25 01:17:43 -05:00
|
|
|
for name, task of tasks
|
|
|
|
spaces: 20 - name.length
|
|
|
|
spaces: if spaces > 0 then (' ' for i in [0..spaces]).join('') else ''
|
2010-04-11 16:57:53 -04:00
|
|
|
desc: if task.description then "# $task.description" else ''
|
2010-04-04 00:20:17 -04:00
|
|
|
puts "cake $name$spaces $desc"
|
2010-03-06 13:59:11 -05:00
|
|
|
puts oparse.help() if switches.length
|
2010-02-25 01:17:43 -05:00
|
|
|
|
|
|
|
# Print an error and exit when attempting to all an undefined task.
|
|
|
|
no_such_task: (task) ->
|
2010-04-27 07:59:19 -04:00
|
|
|
puts "No such task: \"$task\""
|
2010-03-06 13:59:11 -05:00
|
|
|
process.exit 1
|