/* * Copyright 2004-2005 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Gant script that evaluates all installed scripts to create help output * * @author Graeme Rocher * * @since 0.4 */ import grails.util.GrailsNameUtils includeTargets << grailsScript("Init") class HelpEvaluatingCategory { static defaultTask = "" static helpText = [:] static target(Object obj, Map args, Closure callable) { def entry = args.entrySet().iterator().next() helpText[(entry.key)] = entry.value if (entry.key == "default") { defaultTask = "default" } } static getDefaultDescription(Object obj) { return helpText[defaultTask] } static setDefaultTarget(Object obj, val) { defaultTask = val } } File getHelpFile(File script) { File helpDir = new File(grailsTmp, "help") if (!helpDir.exists()) helpDir.mkdir() String scriptname = script.getName() return new File(helpDir, scriptname.substring(0, scriptname.lastIndexOf('.')) + ".txt") } boolean shouldGenerateHelp(File script) { File file = getHelpFile(script) return (!file.exists() || file.lastModified() < script.lastModified() ) } target ( 'default' : "Prints out the help for each script") { ant.mkdir(dir:grailsTmp) def scripts = getAllScripts().collect { it.file } def helpText = "" if(args) { def fileName = GrailsNameUtils.getNameFromScript(args) def file = scripts.find { def scriptFileName = it.name[0..-8] if(scriptFileName.endsWith("_")) scriptFileName = scriptFileName[0..-2] scriptFileName == fileName } if(file) { println """ Usage (optionals marked with *): grails [environment]* """ def gcl = new GroovyClassLoader() use(HelpEvaluatingCategory.class) { if (shouldGenerateHelp(file)) { try { def script = gcl.parseClass(file).newInstance() script.binding = binding script.run() def scriptName = GrailsNameUtils.getScriptName(file.name) helpText = "grails ${scriptName} -- ${getDefaultDescription()}" File helpFile = getHelpFile(file) if(!helpFile.exists()) helpFile.createNewFile() helpFile.write(helpText) } catch(Throwable t) { println "Warning: Error caching created help for ${file}: ${t.message}" println helpText } } else { helpText = getHelpFile(file).text } println helpText } } else { println "No script found for name: $args" } } else { println """ Usage (optionals marked with *): grails [environment]* [target] [arguments]* Examples: grails dev run-app grails create-app books Available Targets (type grails help 'target-name' for more info):""" scripts.unique { it.name }. sort{ it.name }.each { file -> def scriptName = GrailsNameUtils.getScriptName(file.name) println "grails ${scriptName}" } } } target( showHelp: "Show help for a particular command") { def gcl = new GroovyClassLoader() use(HelpEvaluatingCategory.class) { if (shouldGenerateHelp(file)) { try { def script = gcl.parseClass(file).newInstance() script.binding = binding script.run() def scriptName = GrailsNameUtils.getScriptName(file.name) helpText = "grails ${scriptName} -- ${getDefaultDescription()}" getHelpFile(file).write(helpText) } catch(Throwable t) { println "Error creating help for ${file}: ${t.message}" t.printStackTrace(System.out) } } else { helpText = getHelpFile(file).text } println helpText } }