001    package org.apache.maven.scm.plugin;
002    
003    import java.util.ArrayList;
004    import java.util.Iterator;
005    import java.util.List;
006    
007    import org.apache.maven.plugin.AbstractMojo;
008    import org.apache.maven.plugin.MojoExecutionException;
009    
010    /**
011     * Display help information on maven-scm-plugin.<br/> Call <pre>  mvn scm:help -Ddetail=true -Dgoal=&lt;goal-name&gt;</pre> to display parameter details.
012     *
013     * @version generated on Sat Sep 08 17:44:32 CEST 2012
014     * @author org.apache.maven.tools.plugin.generator.PluginHelpGenerator (version 2.9)
015     * @goal help
016     * @requiresProject false
017     * @threadSafe
018     */
019    @SuppressWarnings( "all" )
020    public class HelpMojo
021        extends AbstractMojo
022    {
023        /**
024         * If <code>true</code>, display all settable properties for each goal.
025         * 
026         * @parameter expression="${detail}" default-value="false"
027         */
028        private boolean detail;
029    
030        /**
031         * The name of the goal for which to show help. If unspecified, all goals will be displayed.
032         * 
033         * @parameter expression="${goal}"
034         */
035        private java.lang.String goal;
036    
037        /**
038         * The maximum length of a display line, should be positive.
039         * 
040         * @parameter expression="${lineLength}" default-value="80"
041         */
042        private int lineLength;
043    
044        /**
045         * The number of spaces per indentation level, should be positive.
046         * 
047         * @parameter expression="${indentSize}" default-value="2"
048         */
049        private int indentSize;
050    
051    
052        /** {@inheritDoc} */
053        public void execute()
054            throws MojoExecutionException
055        {
056            if ( lineLength <= 0 )
057            {
058                getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
059                lineLength = 80;
060            }
061            if ( indentSize <= 0 )
062            {
063                getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
064                indentSize = 2;
065            }
066    
067            StringBuffer sb = new StringBuffer();
068    
069            append( sb, "org.apache.maven.plugins:maven-scm-plugin:1.8", 0 );
070            append( sb, "", 0 );
071    
072            append( sb, "Maven SCM Plugin", 0 );
073            append( sb, "Maven Plugin that allows accessing different SCMs.", 1 );
074            append( sb, "", 0 );
075    
076            if ( goal == null || goal.length() <= 0 )
077            {
078                append( sb, "This plugin has 19 goals:", 0 );
079                append( sb, "", 0 );
080            }
081    
082            if ( goal == null || goal.length() <= 0 || "add".equals( goal ) )
083            {
084                append( sb, "scm:add", 0 );
085                append( sb, "Add a file set to the project.", 1 );
086                append( sb, "", 0 );
087                if ( detail )
088                {
089                    append( sb, "Available parameters:", 1 );
090                    append( sb, "", 0 );
091    
092                    append( sb, "basedir", 2 );
093                    append( sb, "The base directory.", 3 );
094                    append( sb, "Required: Yes", 3 );
095                    append( sb, "Expression: ${basedir}", 3 );
096                    append( sb, "", 0 );
097    
098                    append( sb, "connectionType (Default: connection)", 2 );
099                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
100                    append( sb, "Expression: ${connectionType}", 3 );
101                    append( sb, "", 0 );
102    
103                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
104                    append( sb, "The SCM connection URL.", 3 );
105                    append( sb, "Expression: ${connectionUrl}", 3 );
106                    append( sb, "", 0 );
107    
108                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
109                    append( sb, "The SCM connection URL for developers.", 3 );
110                    append( sb, "Expression: ${connectionUrl}", 3 );
111                    append( sb, "", 0 );
112    
113                    append( sb, "excludes", 2 );
114                    append( sb, "Comma separated list of excludes file pattern.", 3 );
115                    append( sb, "Expression: ${excludes}", 3 );
116                    append( sb, "", 0 );
117    
118                    append( sb, "includes", 2 );
119                    append( sb, "Comma separated list of includes file pattern.", 3 );
120                    append( sb, "Expression: ${includes}", 3 );
121                    append( sb, "", 0 );
122    
123                    append( sb, "passphrase", 2 );
124                    append( sb, "The passphrase (used by java svn).", 3 );
125                    append( sb, "Expression: ${passphrase}", 3 );
126                    append( sb, "", 0 );
127    
128                    append( sb, "password", 2 );
129                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
130                    append( sb, "Expression: ${password}", 3 );
131                    append( sb, "", 0 );
132    
133                    append( sb, "privateKey", 2 );
134                    append( sb, "The private key (used by java svn).", 3 );
135                    append( sb, "Expression: ${privateKey}", 3 );
136                    append( sb, "", 0 );
137    
138                    append( sb, "providerImplementations", 2 );
139                    append( sb, "List of provider implementations.", 3 );
140                    append( sb, "", 0 );
141    
142                    append( sb, "pushChanges (Default: true)", 2 );
143                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
144                    append( sb, "Expression: ${pushChanges}", 3 );
145                    append( sb, "", 0 );
146    
147                    append( sb, "systemProperties", 2 );
148                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
149                    append( sb, "", 0 );
150    
151                    append( sb, "tagBase", 2 );
152                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
153                    append( sb, "Expression: ${tagBase}", 3 );
154                    append( sb, "", 0 );
155    
156                    append( sb, "username", 2 );
157                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
158                    append( sb, "Expression: ${username}", 3 );
159                    append( sb, "", 0 );
160    
161                    append( sb, "workingDirectory", 2 );
162                    append( sb, "The working directory.", 3 );
163                    append( sb, "Expression: ${workingDirectory}", 3 );
164                    append( sb, "", 0 );
165                }
166            }
167    
168            if ( goal == null || goal.length() <= 0 || "bootstrap".equals( goal ) )
169            {
170                append( sb, "scm:bootstrap", 0 );
171                append( sb, "Pull the project source from the configured scm and execute the configured goals.", 1 );
172                append( sb, "", 0 );
173                if ( detail )
174                {
175                    append( sb, "Available parameters:", 1 );
176                    append( sb, "", 0 );
177    
178                    append( sb, "basedir", 2 );
179                    append( sb, "The base directory.", 3 );
180                    append( sb, "Required: Yes", 3 );
181                    append( sb, "Expression: ${basedir}", 3 );
182                    append( sb, "", 0 );
183    
184                    append( sb, "checkoutDirectory (Default: ${project.build.directory}/checkout)", 2 );
185                    append( sb, "The directory to checkout the sources to for the bootstrap and checkout goals.", 3 );
186                    append( sb, "Expression: ${checkoutDirectory}", 3 );
187                    append( sb, "", 0 );
188    
189                    append( sb, "connectionType (Default: connection)", 2 );
190                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
191                    append( sb, "Expression: ${connectionType}", 3 );
192                    append( sb, "", 0 );
193    
194                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
195                    append( sb, "The SCM connection URL.", 3 );
196                    append( sb, "Expression: ${connectionUrl}", 3 );
197                    append( sb, "", 0 );
198    
199                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
200                    append( sb, "The SCM connection URL for developers.", 3 );
201                    append( sb, "Expression: ${connectionUrl}", 3 );
202                    append( sb, "", 0 );
203    
204                    append( sb, "excludes", 2 );
205                    append( sb, "Comma separated list of excludes file pattern.", 3 );
206                    append( sb, "Expression: ${excludes}", 3 );
207                    append( sb, "", 0 );
208    
209                    append( sb, "goals", 2 );
210                    append( sb, "The goals to run on the clean checkout of a project for the bootstrap goal. If none are specified, then the default goal for the project is executed. Multiple goals should be comma separated.", 3 );
211                    append( sb, "Expression: ${goals}", 3 );
212                    append( sb, "", 0 );
213    
214                    append( sb, "goalsDirectory", 2 );
215                    append( sb, "The subdirectory (under the project directory) in which to run the goals. The project directory is the same as the checkout directory in most cases, but for some SCMs, it is a subdirectory of the checkout directory.", 3 );
216                    append( sb, "Expression: ${goalsDirectory}", 3 );
217                    append( sb, "", 0 );
218    
219                    append( sb, "includes", 2 );
220                    append( sb, "Comma separated list of includes file pattern.", 3 );
221                    append( sb, "Expression: ${includes}", 3 );
222                    append( sb, "", 0 );
223    
224                    append( sb, "passphrase", 2 );
225                    append( sb, "The passphrase (used by java svn).", 3 );
226                    append( sb, "Expression: ${passphrase}", 3 );
227                    append( sb, "", 0 );
228    
229                    append( sb, "password", 2 );
230                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
231                    append( sb, "Expression: ${password}", 3 );
232                    append( sb, "", 0 );
233    
234                    append( sb, "privateKey", 2 );
235                    append( sb, "The private key (used by java svn).", 3 );
236                    append( sb, "Expression: ${privateKey}", 3 );
237                    append( sb, "", 0 );
238    
239                    append( sb, "profiles", 2 );
240                    append( sb, "A list of profiles to run with the goals. Multiple profiles must be comma separated with no spaces.", 3 );
241                    append( sb, "Expression: ${profiles}", 3 );
242                    append( sb, "", 0 );
243    
244                    append( sb, "providerImplementations", 2 );
245                    append( sb, "List of provider implementations.", 3 );
246                    append( sb, "", 0 );
247    
248                    append( sb, "pushChanges (Default: true)", 2 );
249                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
250                    append( sb, "Expression: ${pushChanges}", 3 );
251                    append( sb, "", 0 );
252    
253                    append( sb, "scmVersion", 2 );
254                    append( sb, "The version (revision number/branch name/tag name).", 3 );
255                    append( sb, "Expression: ${scmVersion}", 3 );
256                    append( sb, "", 0 );
257    
258                    append( sb, "scmVersionType", 2 );
259                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
260                    append( sb, "Expression: ${scmVersionType}", 3 );
261                    append( sb, "", 0 );
262    
263                    append( sb, "skipCheckoutIfExists (Default: false)", 2 );
264                    append( sb, "Skip checkout if checkoutDirectory exists.", 3 );
265                    append( sb, "Expression: ${skipCheckoutIfExists}", 3 );
266                    append( sb, "", 0 );
267    
268                    append( sb, "systemProperties", 2 );
269                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
270                    append( sb, "", 0 );
271    
272                    append( sb, "tagBase", 2 );
273                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
274                    append( sb, "Expression: ${tagBase}", 3 );
275                    append( sb, "", 0 );
276    
277                    append( sb, "useExport", 2 );
278                    append( sb, "Use Export instead of checkout", 3 );
279                    append( sb, "Expression: ${useExport}", 3 );
280                    append( sb, "", 0 );
281    
282                    append( sb, "username", 2 );
283                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
284                    append( sb, "Expression: ${username}", 3 );
285                    append( sb, "", 0 );
286    
287                    append( sb, "workingDirectory", 2 );
288                    append( sb, "The working directory.", 3 );
289                    append( sb, "Expression: ${workingDirectory}", 3 );
290                    append( sb, "", 0 );
291                }
292            }
293    
294            if ( goal == null || goal.length() <= 0 || "branch".equals( goal ) )
295            {
296                append( sb, "scm:branch", 0 );
297                append( sb, "Branch the project.", 1 );
298                append( sb, "", 0 );
299                if ( detail )
300                {
301                    append( sb, "Available parameters:", 1 );
302                    append( sb, "", 0 );
303    
304                    append( sb, "basedir", 2 );
305                    append( sb, "The base directory.", 3 );
306                    append( sb, "Required: Yes", 3 );
307                    append( sb, "Expression: ${basedir}", 3 );
308                    append( sb, "", 0 );
309    
310                    append( sb, "branch", 2 );
311                    append( sb, "The branch name.", 3 );
312                    append( sb, "Required: Yes", 3 );
313                    append( sb, "Expression: ${branch}", 3 );
314                    append( sb, "", 0 );
315    
316                    append( sb, "connectionType (Default: connection)", 2 );
317                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
318                    append( sb, "Expression: ${connectionType}", 3 );
319                    append( sb, "", 0 );
320    
321                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
322                    append( sb, "The SCM connection URL.", 3 );
323                    append( sb, "Expression: ${connectionUrl}", 3 );
324                    append( sb, "", 0 );
325    
326                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
327                    append( sb, "The SCM connection URL for developers.", 3 );
328                    append( sb, "Expression: ${connectionUrl}", 3 );
329                    append( sb, "", 0 );
330    
331                    append( sb, "excludes", 2 );
332                    append( sb, "Comma separated list of excludes file pattern.", 3 );
333                    append( sb, "Expression: ${excludes}", 3 );
334                    append( sb, "", 0 );
335    
336                    append( sb, "includes", 2 );
337                    append( sb, "Comma separated list of includes file pattern.", 3 );
338                    append( sb, "Expression: ${includes}", 3 );
339                    append( sb, "", 0 );
340    
341                    append( sb, "message", 2 );
342                    append( sb, "The message applied to the tag creation.", 3 );
343                    append( sb, "Expression: ${message}", 3 );
344                    append( sb, "", 0 );
345    
346                    append( sb, "passphrase", 2 );
347                    append( sb, "The passphrase (used by java svn).", 3 );
348                    append( sb, "Expression: ${passphrase}", 3 );
349                    append( sb, "", 0 );
350    
351                    append( sb, "password", 2 );
352                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
353                    append( sb, "Expression: ${password}", 3 );
354                    append( sb, "", 0 );
355    
356                    append( sb, "privateKey", 2 );
357                    append( sb, "The private key (used by java svn).", 3 );
358                    append( sb, "Expression: ${privateKey}", 3 );
359                    append( sb, "", 0 );
360    
361                    append( sb, "providerImplementations", 2 );
362                    append( sb, "List of provider implementations.", 3 );
363                    append( sb, "", 0 );
364    
365                    append( sb, "pushChanges (Default: true)", 2 );
366                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
367                    append( sb, "Expression: ${pushChanges}", 3 );
368                    append( sb, "", 0 );
369    
370                    append( sb, "remoteBranching (Default: true)", 2 );
371                    append( sb, "currently only implemented with svn scm. Enable a workaround to prevent issue due to svn client > 1.5.0 (http://jira.codehaus.org/browse/SCM-406)", 3 );
372                    append( sb, "Expression: ${remoteBranching}", 3 );
373                    append( sb, "", 0 );
374    
375                    append( sb, "systemProperties", 2 );
376                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
377                    append( sb, "", 0 );
378    
379                    append( sb, "tagBase", 2 );
380                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
381                    append( sb, "Expression: ${tagBase}", 3 );
382                    append( sb, "", 0 );
383    
384                    append( sb, "username", 2 );
385                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
386                    append( sb, "Expression: ${username}", 3 );
387                    append( sb, "", 0 );
388    
389                    append( sb, "workingDirectory", 2 );
390                    append( sb, "The working directory.", 3 );
391                    append( sb, "Expression: ${workingDirectory}", 3 );
392                    append( sb, "", 0 );
393                }
394            }
395    
396            if ( goal == null || goal.length() <= 0 || "changelog".equals( goal ) )
397            {
398                append( sb, "scm:changelog", 0 );
399                append( sb, "Dump changelog contents to console. It is mainly used to test maven-scm-api\'s changelog command.", 1 );
400                append( sb, "", 0 );
401                if ( detail )
402                {
403                    append( sb, "Available parameters:", 1 );
404                    append( sb, "", 0 );
405    
406                    append( sb, "basedir", 2 );
407                    append( sb, "The base directory.", 3 );
408                    append( sb, "Required: Yes", 3 );
409                    append( sb, "Expression: ${basedir}", 3 );
410                    append( sb, "", 0 );
411    
412                    append( sb, "connectionType (Default: connection)", 2 );
413                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
414                    append( sb, "Expression: ${connectionType}", 3 );
415                    append( sb, "", 0 );
416    
417                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
418                    append( sb, "The SCM connection URL.", 3 );
419                    append( sb, "Expression: ${connectionUrl}", 3 );
420                    append( sb, "", 0 );
421    
422                    append( sb, "dateFormat", 2 );
423                    append( sb, "Date Format in changelog output of scm tool.", 3 );
424                    append( sb, "Expression: ${dateFormat}", 3 );
425                    append( sb, "", 0 );
426    
427                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
428                    append( sb, "The SCM connection URL for developers.", 3 );
429                    append( sb, "Expression: ${connectionUrl}", 3 );
430                    append( sb, "", 0 );
431    
432                    append( sb, "endDate", 2 );
433                    append( sb, "End Date.", 3 );
434                    append( sb, "Expression: ${endDate}", 3 );
435                    append( sb, "", 0 );
436    
437                    append( sb, "endScmVersion", 2 );
438                    append( sb, "End Scm Version.", 3 );
439                    append( sb, "Expression: ${endScmVersion}", 3 );
440                    append( sb, "", 0 );
441    
442                    append( sb, "endScmVersionType", 2 );
443                    append( sb, "End Scm Version Type.", 3 );
444                    append( sb, "Expression: ${endScmVersionType}", 3 );
445                    append( sb, "", 0 );
446    
447                    append( sb, "excludes", 2 );
448                    append( sb, "Comma separated list of excludes file pattern.", 3 );
449                    append( sb, "Expression: ${excludes}", 3 );
450                    append( sb, "", 0 );
451    
452                    append( sb, "includes", 2 );
453                    append( sb, "Comma separated list of includes file pattern.", 3 );
454                    append( sb, "Expression: ${includes}", 3 );
455                    append( sb, "", 0 );
456    
457                    append( sb, "passphrase", 2 );
458                    append( sb, "The passphrase (used by java svn).", 3 );
459                    append( sb, "Expression: ${passphrase}", 3 );
460                    append( sb, "", 0 );
461    
462                    append( sb, "password", 2 );
463                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
464                    append( sb, "Expression: ${password}", 3 );
465                    append( sb, "", 0 );
466    
467                    append( sb, "privateKey", 2 );
468                    append( sb, "The private key (used by java svn).", 3 );
469                    append( sb, "Expression: ${privateKey}", 3 );
470                    append( sb, "", 0 );
471    
472                    append( sb, "providerImplementations", 2 );
473                    append( sb, "List of provider implementations.", 3 );
474                    append( sb, "", 0 );
475    
476                    append( sb, "pushChanges (Default: true)", 2 );
477                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
478                    append( sb, "Expression: ${pushChanges}", 3 );
479                    append( sb, "", 0 );
480    
481                    append( sb, "scmVersion", 2 );
482                    append( sb, "The version (revision number/branch name/tag name).", 3 );
483                    append( sb, "Expression: ${scmVersion}", 3 );
484                    append( sb, "", 0 );
485    
486                    append( sb, "scmVersionType", 2 );
487                    append( sb, "The version type (branch/tag) of scmVersion.", 3 );
488                    append( sb, "Expression: ${scmVersionType}", 3 );
489                    append( sb, "", 0 );
490    
491                    append( sb, "startDate", 2 );
492                    append( sb, "Start Date.", 3 );
493                    append( sb, "Expression: ${startDate}", 3 );
494                    append( sb, "", 0 );
495    
496                    append( sb, "startScmVersion", 2 );
497                    append( sb, "Start Scm Version.", 3 );
498                    append( sb, "Expression: ${startScmVersion}", 3 );
499                    append( sb, "", 0 );
500    
501                    append( sb, "startScmVersionType", 2 );
502                    append( sb, "Start Scm Version Type.", 3 );
503                    append( sb, "Expression: ${startScmVersionType}", 3 );
504                    append( sb, "", 0 );
505    
506                    append( sb, "systemProperties", 2 );
507                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
508                    append( sb, "", 0 );
509    
510                    append( sb, "tagBase", 2 );
511                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
512                    append( sb, "Expression: ${tagBase}", 3 );
513                    append( sb, "", 0 );
514    
515                    append( sb, "userDateFormat (Default: yyyy-MM-dd)", 2 );
516                    append( sb, "Date format to use for the specified startDate and/or endDate.", 3 );
517                    append( sb, "Expression: ${userDateFormat}", 3 );
518                    append( sb, "", 0 );
519    
520                    append( sb, "username", 2 );
521                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
522                    append( sb, "Expression: ${username}", 3 );
523                    append( sb, "", 0 );
524    
525                    append( sb, "workingDirectory", 2 );
526                    append( sb, "The working directory.", 3 );
527                    append( sb, "Expression: ${workingDirectory}", 3 );
528                    append( sb, "", 0 );
529                }
530            }
531    
532            if ( goal == null || goal.length() <= 0 || "check-local-modification".equals( goal ) )
533            {
534                append( sb, "scm:check-local-modification", 0 );
535                append( sb, "This mojo will fail the build if there is any local modifications", 1 );
536                append( sb, "", 0 );
537                if ( detail )
538                {
539                    append( sb, "Available parameters:", 1 );
540                    append( sb, "", 0 );
541    
542                    append( sb, "basedir", 2 );
543                    append( sb, "The base directory.", 3 );
544                    append( sb, "Required: Yes", 3 );
545                    append( sb, "Expression: ${basedir}", 3 );
546                    append( sb, "", 0 );
547    
548                    append( sb, "connectionType (Default: connection)", 2 );
549                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
550                    append( sb, "Expression: ${connectionType}", 3 );
551                    append( sb, "", 0 );
552    
553                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
554                    append( sb, "The SCM connection URL.", 3 );
555                    append( sb, "Expression: ${connectionUrl}", 3 );
556                    append( sb, "", 0 );
557    
558                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
559                    append( sb, "The SCM connection URL for developers.", 3 );
560                    append( sb, "Expression: ${connectionUrl}", 3 );
561                    append( sb, "", 0 );
562    
563                    append( sb, "errorMessage (Default: The build will stop as there is local modifications)", 2 );
564                    append( sb, "Custom error message", 3 );
565                    append( sb, "Expression: ${scm.checkLocalModification.errorMessage}", 3 );
566                    append( sb, "", 0 );
567    
568                    append( sb, "excludes", 2 );
569                    append( sb, "Comma separated list of excludes file pattern.", 3 );
570                    append( sb, "Expression: ${excludes}", 3 );
571                    append( sb, "", 0 );
572    
573                    append( sb, "includes", 2 );
574                    append( sb, "Comma separated list of includes file pattern.", 3 );
575                    append( sb, "Expression: ${includes}", 3 );
576                    append( sb, "", 0 );
577    
578                    append( sb, "passphrase", 2 );
579                    append( sb, "The passphrase (used by java svn).", 3 );
580                    append( sb, "Expression: ${passphrase}", 3 );
581                    append( sb, "", 0 );
582    
583                    append( sb, "password", 2 );
584                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
585                    append( sb, "Expression: ${password}", 3 );
586                    append( sb, "", 0 );
587    
588                    append( sb, "privateKey", 2 );
589                    append( sb, "The private key (used by java svn).", 3 );
590                    append( sb, "Expression: ${privateKey}", 3 );
591                    append( sb, "", 0 );
592    
593                    append( sb, "providerImplementations", 2 );
594                    append( sb, "List of provider implementations.", 3 );
595                    append( sb, "", 0 );
596    
597                    append( sb, "pushChanges (Default: true)", 2 );
598                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
599                    append( sb, "Expression: ${pushChanges}", 3 );
600                    append( sb, "", 0 );
601    
602                    append( sb, "skip (Default: false)", 2 );
603                    append( sb, "Custom error message", 3 );
604                    append( sb, "Expression: ${scm.checkLocalModification.skip}", 3 );
605                    append( sb, "", 0 );
606    
607                    append( sb, "systemProperties", 2 );
608                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
609                    append( sb, "", 0 );
610    
611                    append( sb, "tagBase", 2 );
612                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
613                    append( sb, "Expression: ${tagBase}", 3 );
614                    append( sb, "", 0 );
615    
616                    append( sb, "username", 2 );
617                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
618                    append( sb, "Expression: ${username}", 3 );
619                    append( sb, "", 0 );
620    
621                    append( sb, "workingDirectory", 2 );
622                    append( sb, "The working directory.", 3 );
623                    append( sb, "Expression: ${workingDirectory}", 3 );
624                    append( sb, "", 0 );
625                }
626            }
627    
628            if ( goal == null || goal.length() <= 0 || "checkin".equals( goal ) )
629            {
630                append( sb, "scm:checkin", 0 );
631                append( sb, "Commit changes to the configured scm url.", 1 );
632                append( sb, "", 0 );
633                if ( detail )
634                {
635                    append( sb, "Available parameters:", 1 );
636                    append( sb, "", 0 );
637    
638                    append( sb, "basedir", 2 );
639                    append( sb, "The base directory.", 3 );
640                    append( sb, "Required: Yes", 3 );
641                    append( sb, "Expression: ${basedir}", 3 );
642                    append( sb, "", 0 );
643    
644                    append( sb, "connectionType (Default: developerConnection)", 2 );
645                    append( sb, "The configured scm url to use.", 3 );
646                    append( sb, "Expression: ${connectionType}", 3 );
647                    append( sb, "", 0 );
648    
649                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
650                    append( sb, "The SCM connection URL.", 3 );
651                    append( sb, "Expression: ${connectionUrl}", 3 );
652                    append( sb, "", 0 );
653    
654                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
655                    append( sb, "The SCM connection URL for developers.", 3 );
656                    append( sb, "Expression: ${connectionUrl}", 3 );
657                    append( sb, "", 0 );
658    
659                    append( sb, "excludes", 2 );
660                    append( sb, "Comma separated list of excludes file pattern.", 3 );
661                    append( sb, "Expression: ${excludes}", 3 );
662                    append( sb, "", 0 );
663    
664                    append( sb, "includes", 2 );
665                    append( sb, "Comma separated list of includes file pattern.", 3 );
666                    append( sb, "Expression: ${includes}", 3 );
667                    append( sb, "", 0 );
668    
669                    append( sb, "message", 2 );
670                    append( sb, "Commit log.", 3 );
671                    append( sb, "Expression: ${message}", 3 );
672                    append( sb, "", 0 );
673    
674                    append( sb, "passphrase", 2 );
675                    append( sb, "The passphrase (used by java svn).", 3 );
676                    append( sb, "Expression: ${passphrase}", 3 );
677                    append( sb, "", 0 );
678    
679                    append( sb, "password", 2 );
680                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
681                    append( sb, "Expression: ${password}", 3 );
682                    append( sb, "", 0 );
683    
684                    append( sb, "privateKey", 2 );
685                    append( sb, "The private key (used by java svn).", 3 );
686                    append( sb, "Expression: ${privateKey}", 3 );
687                    append( sb, "", 0 );
688    
689                    append( sb, "providerImplementations", 2 );
690                    append( sb, "List of provider implementations.", 3 );
691                    append( sb, "", 0 );
692    
693                    append( sb, "pushChanges (Default: true)", 2 );
694                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
695                    append( sb, "Expression: ${pushChanges}", 3 );
696                    append( sb, "", 0 );
697    
698                    append( sb, "scmVersion", 2 );
699                    append( sb, "The version (revision number/branch name/tag name).", 3 );
700                    append( sb, "Expression: ${scmVersion}", 3 );
701                    append( sb, "", 0 );
702    
703                    append( sb, "scmVersionType", 2 );
704                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
705                    append( sb, "Expression: ${scmVersionType}", 3 );
706                    append( sb, "", 0 );
707    
708                    append( sb, "systemProperties", 2 );
709                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
710                    append( sb, "", 0 );
711    
712                    append( sb, "tagBase", 2 );
713                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
714                    append( sb, "Expression: ${tagBase}", 3 );
715                    append( sb, "", 0 );
716    
717                    append( sb, "username", 2 );
718                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
719                    append( sb, "Expression: ${username}", 3 );
720                    append( sb, "", 0 );
721    
722                    append( sb, "workingDirectory", 2 );
723                    append( sb, "The working directory.", 3 );
724                    append( sb, "Expression: ${workingDirectory}", 3 );
725                    append( sb, "", 0 );
726                }
727            }
728    
729            if ( goal == null || goal.length() <= 0 || "checkout".equals( goal ) )
730            {
731                append( sb, "scm:checkout", 0 );
732                append( sb, "Get a fresh copy of the latest source from the configured scm url.", 1 );
733                append( sb, "", 0 );
734                if ( detail )
735                {
736                    append( sb, "Available parameters:", 1 );
737                    append( sb, "", 0 );
738    
739                    append( sb, "basedir", 2 );
740                    append( sb, "The base directory.", 3 );
741                    append( sb, "Required: Yes", 3 );
742                    append( sb, "Expression: ${basedir}", 3 );
743                    append( sb, "", 0 );
744    
745                    append( sb, "checkoutDirectory (Default: ${project.build.directory}/checkout)", 2 );
746                    append( sb, "The directory to checkout the sources to for the bootstrap and checkout goals.", 3 );
747                    append( sb, "Expression: ${checkoutDirectory}", 3 );
748                    append( sb, "", 0 );
749    
750                    append( sb, "connectionType (Default: connection)", 2 );
751                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
752                    append( sb, "Expression: ${connectionType}", 3 );
753                    append( sb, "", 0 );
754    
755                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
756                    append( sb, "The SCM connection URL.", 3 );
757                    append( sb, "Expression: ${connectionUrl}", 3 );
758                    append( sb, "", 0 );
759    
760                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
761                    append( sb, "The SCM connection URL for developers.", 3 );
762                    append( sb, "Expression: ${connectionUrl}", 3 );
763                    append( sb, "", 0 );
764    
765                    append( sb, "excludes", 2 );
766                    append( sb, "Comma separated list of excludes file pattern.", 3 );
767                    append( sb, "Expression: ${excludes}", 3 );
768                    append( sb, "", 0 );
769    
770                    append( sb, "includes", 2 );
771                    append( sb, "Comma separated list of includes file pattern.", 3 );
772                    append( sb, "Expression: ${includes}", 3 );
773                    append( sb, "", 0 );
774    
775                    append( sb, "passphrase", 2 );
776                    append( sb, "The passphrase (used by java svn).", 3 );
777                    append( sb, "Expression: ${passphrase}", 3 );
778                    append( sb, "", 0 );
779    
780                    append( sb, "password", 2 );
781                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
782                    append( sb, "Expression: ${password}", 3 );
783                    append( sb, "", 0 );
784    
785                    append( sb, "privateKey", 2 );
786                    append( sb, "The private key (used by java svn).", 3 );
787                    append( sb, "Expression: ${privateKey}", 3 );
788                    append( sb, "", 0 );
789    
790                    append( sb, "providerImplementations", 2 );
791                    append( sb, "List of provider implementations.", 3 );
792                    append( sb, "", 0 );
793    
794                    append( sb, "pushChanges (Default: true)", 2 );
795                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
796                    append( sb, "Expression: ${pushChanges}", 3 );
797                    append( sb, "", 0 );
798    
799                    append( sb, "scmVersion", 2 );
800                    append( sb, "The version (revision number/branch name/tag name).", 3 );
801                    append( sb, "Expression: ${scmVersion}", 3 );
802                    append( sb, "", 0 );
803    
804                    append( sb, "scmVersionType", 2 );
805                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
806                    append( sb, "Expression: ${scmVersionType}", 3 );
807                    append( sb, "", 0 );
808    
809                    append( sb, "skipCheckoutIfExists (Default: false)", 2 );
810                    append( sb, "Skip checkout if checkoutDirectory exists.", 3 );
811                    append( sb, "Expression: ${skipCheckoutIfExists}", 3 );
812                    append( sb, "", 0 );
813    
814                    append( sb, "systemProperties", 2 );
815                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
816                    append( sb, "", 0 );
817    
818                    append( sb, "tagBase", 2 );
819                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
820                    append( sb, "Expression: ${tagBase}", 3 );
821                    append( sb, "", 0 );
822    
823                    append( sb, "useExport", 2 );
824                    append( sb, "Use Export instead of checkout", 3 );
825                    append( sb, "Expression: ${useExport}", 3 );
826                    append( sb, "", 0 );
827    
828                    append( sb, "username", 2 );
829                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
830                    append( sb, "Expression: ${username}", 3 );
831                    append( sb, "", 0 );
832    
833                    append( sb, "workingDirectory", 2 );
834                    append( sb, "The working directory.", 3 );
835                    append( sb, "Expression: ${workingDirectory}", 3 );
836                    append( sb, "", 0 );
837                }
838            }
839    
840            if ( goal == null || goal.length() <= 0 || "diff".equals( goal ) )
841            {
842                append( sb, "scm:diff", 0 );
843                append( sb, "Display the difference of the working copy with the latest copy in the configured scm url.", 1 );
844                append( sb, "", 0 );
845                if ( detail )
846                {
847                    append( sb, "Available parameters:", 1 );
848                    append( sb, "", 0 );
849    
850                    append( sb, "basedir", 2 );
851                    append( sb, "The base directory.", 3 );
852                    append( sb, "Required: Yes", 3 );
853                    append( sb, "Expression: ${basedir}", 3 );
854                    append( sb, "", 0 );
855    
856                    append( sb, "connectionType (Default: connection)", 2 );
857                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
858                    append( sb, "Expression: ${connectionType}", 3 );
859                    append( sb, "", 0 );
860    
861                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
862                    append( sb, "The SCM connection URL.", 3 );
863                    append( sb, "Expression: ${connectionUrl}", 3 );
864                    append( sb, "", 0 );
865    
866                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
867                    append( sb, "The SCM connection URL for developers.", 3 );
868                    append( sb, "Expression: ${connectionUrl}", 3 );
869                    append( sb, "", 0 );
870    
871                    append( sb, "endScmVersion", 2 );
872                    append( sb, "The version (revision number/branch name/tag name).", 3 );
873                    append( sb, "Expression: ${endScmVersion}", 3 );
874                    append( sb, "", 0 );
875    
876                    append( sb, "endScmVersionType", 2 );
877                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
878                    append( sb, "Expression: ${endScmVersionType}", 3 );
879                    append( sb, "", 0 );
880    
881                    append( sb, "excludes", 2 );
882                    append( sb, "Comma separated list of excludes file pattern.", 3 );
883                    append( sb, "Expression: ${excludes}", 3 );
884                    append( sb, "", 0 );
885    
886                    append( sb, "includes", 2 );
887                    append( sb, "Comma separated list of includes file pattern.", 3 );
888                    append( sb, "Expression: ${includes}", 3 );
889                    append( sb, "", 0 );
890    
891                    append( sb, "outputFile (Default: ${project.artifactId}.diff)", 2 );
892                    append( sb, "Output file name.", 3 );
893                    append( sb, "Expression: ${outputFile}", 3 );
894                    append( sb, "", 0 );
895    
896                    append( sb, "passphrase", 2 );
897                    append( sb, "The passphrase (used by java svn).", 3 );
898                    append( sb, "Expression: ${passphrase}", 3 );
899                    append( sb, "", 0 );
900    
901                    append( sb, "password", 2 );
902                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
903                    append( sb, "Expression: ${password}", 3 );
904                    append( sb, "", 0 );
905    
906                    append( sb, "privateKey", 2 );
907                    append( sb, "The private key (used by java svn).", 3 );
908                    append( sb, "Expression: ${privateKey}", 3 );
909                    append( sb, "", 0 );
910    
911                    append( sb, "providerImplementations", 2 );
912                    append( sb, "List of provider implementations.", 3 );
913                    append( sb, "", 0 );
914    
915                    append( sb, "pushChanges (Default: true)", 2 );
916                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
917                    append( sb, "Expression: ${pushChanges}", 3 );
918                    append( sb, "", 0 );
919    
920                    append( sb, "startScmVersion", 2 );
921                    append( sb, "The version (revision number/branch name/tag name).", 3 );
922                    append( sb, "Expression: ${startScmVersion}", 3 );
923                    append( sb, "", 0 );
924    
925                    append( sb, "startScmVersionType", 2 );
926                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
927                    append( sb, "Expression: ${startScmVersionType}", 3 );
928                    append( sb, "", 0 );
929    
930                    append( sb, "systemProperties", 2 );
931                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
932                    append( sb, "", 0 );
933    
934                    append( sb, "tagBase", 2 );
935                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
936                    append( sb, "Expression: ${tagBase}", 3 );
937                    append( sb, "", 0 );
938    
939                    append( sb, "username", 2 );
940                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
941                    append( sb, "Expression: ${username}", 3 );
942                    append( sb, "", 0 );
943    
944                    append( sb, "workingDirectory", 2 );
945                    append( sb, "The working directory.", 3 );
946                    append( sb, "Expression: ${workingDirectory}", 3 );
947                    append( sb, "", 0 );
948                }
949            }
950    
951            if ( goal == null || goal.length() <= 0 || "edit".equals( goal ) )
952            {
953                append( sb, "scm:edit", 0 );
954                append( sb, "Edit/lock a set of files.", 1 );
955                append( sb, "", 0 );
956                if ( detail )
957                {
958                    append( sb, "Available parameters:", 1 );
959                    append( sb, "", 0 );
960    
961                    append( sb, "basedir", 2 );
962                    append( sb, "The base directory.", 3 );
963                    append( sb, "Required: Yes", 3 );
964                    append( sb, "Expression: ${basedir}", 3 );
965                    append( sb, "", 0 );
966    
967                    append( sb, "connectionType (Default: connection)", 2 );
968                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
969                    append( sb, "Expression: ${connectionType}", 3 );
970                    append( sb, "", 0 );
971    
972                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
973                    append( sb, "The SCM connection URL.", 3 );
974                    append( sb, "Expression: ${connectionUrl}", 3 );
975                    append( sb, "", 0 );
976    
977                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
978                    append( sb, "The SCM connection URL for developers.", 3 );
979                    append( sb, "Expression: ${connectionUrl}", 3 );
980                    append( sb, "", 0 );
981    
982                    append( sb, "excludes", 2 );
983                    append( sb, "Comma separated list of excludes file pattern.", 3 );
984                    append( sb, "Expression: ${excludes}", 3 );
985                    append( sb, "", 0 );
986    
987                    append( sb, "includes", 2 );
988                    append( sb, "Comma separated list of includes file pattern.", 3 );
989                    append( sb, "Expression: ${includes}", 3 );
990                    append( sb, "", 0 );
991    
992                    append( sb, "passphrase", 2 );
993                    append( sb, "The passphrase (used by java svn).", 3 );
994                    append( sb, "Expression: ${passphrase}", 3 );
995                    append( sb, "", 0 );
996    
997                    append( sb, "password", 2 );
998                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
999                    append( sb, "Expression: ${password}", 3 );
1000                    append( sb, "", 0 );
1001    
1002                    append( sb, "privateKey", 2 );
1003                    append( sb, "The private key (used by java svn).", 3 );
1004                    append( sb, "Expression: ${privateKey}", 3 );
1005                    append( sb, "", 0 );
1006    
1007                    append( sb, "providerImplementations", 2 );
1008                    append( sb, "List of provider implementations.", 3 );
1009                    append( sb, "", 0 );
1010    
1011                    append( sb, "pushChanges (Default: true)", 2 );
1012                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1013                    append( sb, "Expression: ${pushChanges}", 3 );
1014                    append( sb, "", 0 );
1015    
1016                    append( sb, "systemProperties", 2 );
1017                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1018                    append( sb, "", 0 );
1019    
1020                    append( sb, "tagBase", 2 );
1021                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1022                    append( sb, "Expression: ${tagBase}", 3 );
1023                    append( sb, "", 0 );
1024    
1025                    append( sb, "username", 2 );
1026                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1027                    append( sb, "Expression: ${username}", 3 );
1028                    append( sb, "", 0 );
1029    
1030                    append( sb, "workingDirectory", 2 );
1031                    append( sb, "The working directory.", 3 );
1032                    append( sb, "Expression: ${workingDirectory}", 3 );
1033                    append( sb, "", 0 );
1034                }
1035            }
1036    
1037            if ( goal == null || goal.length() <= 0 || "export".equals( goal ) )
1038            {
1039                append( sb, "scm:export", 0 );
1040                append( sb, "Get a fresh exported copy of the latest source from the configured scm url.", 1 );
1041                append( sb, "", 0 );
1042                if ( detail )
1043                {
1044                    append( sb, "Available parameters:", 1 );
1045                    append( sb, "", 0 );
1046    
1047                    append( sb, "basedir", 2 );
1048                    append( sb, "The base directory.", 3 );
1049                    append( sb, "Required: Yes", 3 );
1050                    append( sb, "Expression: ${basedir}", 3 );
1051                    append( sb, "", 0 );
1052    
1053                    append( sb, "connectionType (Default: connection)", 2 );
1054                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1055                    append( sb, "Expression: ${connectionType}", 3 );
1056                    append( sb, "", 0 );
1057    
1058                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1059                    append( sb, "The SCM connection URL.", 3 );
1060                    append( sb, "Expression: ${connectionUrl}", 3 );
1061                    append( sb, "", 0 );
1062    
1063                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1064                    append( sb, "The SCM connection URL for developers.", 3 );
1065                    append( sb, "Expression: ${connectionUrl}", 3 );
1066                    append( sb, "", 0 );
1067    
1068                    append( sb, "excludes", 2 );
1069                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1070                    append( sb, "Expression: ${excludes}", 3 );
1071                    append( sb, "", 0 );
1072    
1073                    append( sb, "exportDirectory (Default: ${project.build.directory}/export)", 2 );
1074                    append( sb, "The directory to export the sources to.", 3 );
1075                    append( sb, "Required: Yes", 3 );
1076                    append( sb, "Expression: ${exportDirectory}", 3 );
1077                    append( sb, "", 0 );
1078    
1079                    append( sb, "includes", 2 );
1080                    append( sb, "Comma separated list of includes file pattern.", 3 );
1081                    append( sb, "Expression: ${includes}", 3 );
1082                    append( sb, "", 0 );
1083    
1084                    append( sb, "passphrase", 2 );
1085                    append( sb, "The passphrase (used by java svn).", 3 );
1086                    append( sb, "Expression: ${passphrase}", 3 );
1087                    append( sb, "", 0 );
1088    
1089                    append( sb, "password", 2 );
1090                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1091                    append( sb, "Expression: ${password}", 3 );
1092                    append( sb, "", 0 );
1093    
1094                    append( sb, "privateKey", 2 );
1095                    append( sb, "The private key (used by java svn).", 3 );
1096                    append( sb, "Expression: ${privateKey}", 3 );
1097                    append( sb, "", 0 );
1098    
1099                    append( sb, "providerImplementations", 2 );
1100                    append( sb, "List of provider implementations.", 3 );
1101                    append( sb, "", 0 );
1102    
1103                    append( sb, "pushChanges (Default: true)", 2 );
1104                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1105                    append( sb, "Expression: ${pushChanges}", 3 );
1106                    append( sb, "", 0 );
1107    
1108                    append( sb, "scmVersion", 2 );
1109                    append( sb, "The version (revision number/branch name/tag name).", 3 );
1110                    append( sb, "Expression: ${scmVersion}", 3 );
1111                    append( sb, "", 0 );
1112    
1113                    append( sb, "scmVersionType", 2 );
1114                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
1115                    append( sb, "Expression: ${scmVersionType}", 3 );
1116                    append( sb, "", 0 );
1117    
1118                    append( sb, "skipExportIfExists (Default: false)", 2 );
1119                    append( sb, "Skip export if exportDirectory exists.", 3 );
1120                    append( sb, "Expression: ${skipExportIfExists}", 3 );
1121                    append( sb, "", 0 );
1122    
1123                    append( sb, "systemProperties", 2 );
1124                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1125                    append( sb, "", 0 );
1126    
1127                    append( sb, "tagBase", 2 );
1128                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1129                    append( sb, "Expression: ${tagBase}", 3 );
1130                    append( sb, "", 0 );
1131    
1132                    append( sb, "username", 2 );
1133                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1134                    append( sb, "Expression: ${username}", 3 );
1135                    append( sb, "", 0 );
1136    
1137                    append( sb, "workingDirectory", 2 );
1138                    append( sb, "The working directory.", 3 );
1139                    append( sb, "Expression: ${workingDirectory}", 3 );
1140                    append( sb, "", 0 );
1141                }
1142            }
1143    
1144            if ( goal == null || goal.length() <= 0 || "help".equals( goal ) )
1145            {
1146                append( sb, "scm:help", 0 );
1147                append( sb, "Display help information on maven-scm-plugin.\nCall\n\u00a0\u00a0mvn\u00a0scm:help\u00a0-Ddetail=true\u00a0-Dgoal=<goal-name>\nto display parameter details.", 1 );
1148                append( sb, "", 0 );
1149                if ( detail )
1150                {
1151                    append( sb, "Available parameters:", 1 );
1152                    append( sb, "", 0 );
1153    
1154                    append( sb, "detail (Default: false)", 2 );
1155                    append( sb, "If true, display all settable properties for each goal.", 3 );
1156                    append( sb, "Expression: ${detail}", 3 );
1157                    append( sb, "", 0 );
1158    
1159                    append( sb, "goal", 2 );
1160                    append( sb, "The name of the goal for which to show help. If unspecified, all goals will be displayed.", 3 );
1161                    append( sb, "Expression: ${goal}", 3 );
1162                    append( sb, "", 0 );
1163    
1164                    append( sb, "indentSize (Default: 2)", 2 );
1165                    append( sb, "The number of spaces per indentation level, should be positive.", 3 );
1166                    append( sb, "Expression: ${indentSize}", 3 );
1167                    append( sb, "", 0 );
1168    
1169                    append( sb, "lineLength (Default: 80)", 2 );
1170                    append( sb, "The maximum length of a display line, should be positive.", 3 );
1171                    append( sb, "Expression: ${lineLength}", 3 );
1172                    append( sb, "", 0 );
1173                }
1174            }
1175    
1176            if ( goal == null || goal.length() <= 0 || "list".equals( goal ) )
1177            {
1178                append( sb, "scm:list", 0 );
1179                append( sb, "Get the list of project files.", 1 );
1180                append( sb, "", 0 );
1181                if ( detail )
1182                {
1183                    append( sb, "Available parameters:", 1 );
1184                    append( sb, "", 0 );
1185    
1186                    append( sb, "basedir", 2 );
1187                    append( sb, "The base directory.", 3 );
1188                    append( sb, "Required: Yes", 3 );
1189                    append( sb, "Expression: ${basedir}", 3 );
1190                    append( sb, "", 0 );
1191    
1192                    append( sb, "connectionType (Default: connection)", 2 );
1193                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1194                    append( sb, "Expression: ${connectionType}", 3 );
1195                    append( sb, "", 0 );
1196    
1197                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1198                    append( sb, "The SCM connection URL.", 3 );
1199                    append( sb, "Expression: ${connectionUrl}", 3 );
1200                    append( sb, "", 0 );
1201    
1202                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1203                    append( sb, "The SCM connection URL for developers.", 3 );
1204                    append( sb, "Expression: ${connectionUrl}", 3 );
1205                    append( sb, "", 0 );
1206    
1207                    append( sb, "excludes", 2 );
1208                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1209                    append( sb, "Expression: ${excludes}", 3 );
1210                    append( sb, "", 0 );
1211    
1212                    append( sb, "includes", 2 );
1213                    append( sb, "Comma separated list of includes file pattern.", 3 );
1214                    append( sb, "Expression: ${includes}", 3 );
1215                    append( sb, "", 0 );
1216    
1217                    append( sb, "passphrase", 2 );
1218                    append( sb, "The passphrase (used by java svn).", 3 );
1219                    append( sb, "Expression: ${passphrase}", 3 );
1220                    append( sb, "", 0 );
1221    
1222                    append( sb, "password", 2 );
1223                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1224                    append( sb, "Expression: ${password}", 3 );
1225                    append( sb, "", 0 );
1226    
1227                    append( sb, "privateKey", 2 );
1228                    append( sb, "The private key (used by java svn).", 3 );
1229                    append( sb, "Expression: ${privateKey}", 3 );
1230                    append( sb, "", 0 );
1231    
1232                    append( sb, "providerImplementations", 2 );
1233                    append( sb, "List of provider implementations.", 3 );
1234                    append( sb, "", 0 );
1235    
1236                    append( sb, "pushChanges (Default: true)", 2 );
1237                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1238                    append( sb, "Expression: ${pushChanges}", 3 );
1239                    append( sb, "", 0 );
1240    
1241                    append( sb, "recursive (Default: true)", 2 );
1242                    append( sb, "Use recursive mode.", 3 );
1243                    append( sb, "Expression: ${recursive}", 3 );
1244                    append( sb, "", 0 );
1245    
1246                    append( sb, "scmVersion", 2 );
1247                    append( sb, "The version (revision number/branch name/tag name).", 3 );
1248                    append( sb, "Expression: ${scmVersion}", 3 );
1249                    append( sb, "", 0 );
1250    
1251                    append( sb, "scmVersionType", 2 );
1252                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
1253                    append( sb, "Expression: ${scmVersionType}", 3 );
1254                    append( sb, "", 0 );
1255    
1256                    append( sb, "systemProperties", 2 );
1257                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1258                    append( sb, "", 0 );
1259    
1260                    append( sb, "tagBase", 2 );
1261                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1262                    append( sb, "Expression: ${tagBase}", 3 );
1263                    append( sb, "", 0 );
1264    
1265                    append( sb, "username", 2 );
1266                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1267                    append( sb, "Expression: ${username}", 3 );
1268                    append( sb, "", 0 );
1269    
1270                    append( sb, "workingDirectory", 2 );
1271                    append( sb, "The working directory.", 3 );
1272                    append( sb, "Expression: ${workingDirectory}", 3 );
1273                    append( sb, "", 0 );
1274                }
1275            }
1276    
1277            if ( goal == null || goal.length() <= 0 || "remove".equals( goal ) )
1278            {
1279                append( sb, "scm:remove", 0 );
1280                append( sb, "Mark a set of files for deletion.", 1 );
1281                append( sb, "", 0 );
1282                if ( detail )
1283                {
1284                    append( sb, "Available parameters:", 1 );
1285                    append( sb, "", 0 );
1286    
1287                    append( sb, "basedir", 2 );
1288                    append( sb, "The base directory.", 3 );
1289                    append( sb, "Required: Yes", 3 );
1290                    append( sb, "Expression: ${basedir}", 3 );
1291                    append( sb, "", 0 );
1292    
1293                    append( sb, "connectionType (Default: connection)", 2 );
1294                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1295                    append( sb, "Expression: ${connectionType}", 3 );
1296                    append( sb, "", 0 );
1297    
1298                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1299                    append( sb, "The SCM connection URL.", 3 );
1300                    append( sb, "Expression: ${connectionUrl}", 3 );
1301                    append( sb, "", 0 );
1302    
1303                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1304                    append( sb, "The SCM connection URL for developers.", 3 );
1305                    append( sb, "Expression: ${connectionUrl}", 3 );
1306                    append( sb, "", 0 );
1307    
1308                    append( sb, "excludes", 2 );
1309                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1310                    append( sb, "Expression: ${excludes}", 3 );
1311                    append( sb, "", 0 );
1312    
1313                    append( sb, "includes", 2 );
1314                    append( sb, "Comma separated list of includes file pattern.", 3 );
1315                    append( sb, "Expression: ${includes}", 3 );
1316                    append( sb, "", 0 );
1317    
1318                    append( sb, "message", 2 );
1319                    append( sb, "The commit message.", 3 );
1320                    append( sb, "Expression: ${message}", 3 );
1321                    append( sb, "", 0 );
1322    
1323                    append( sb, "passphrase", 2 );
1324                    append( sb, "The passphrase (used by java svn).", 3 );
1325                    append( sb, "Expression: ${passphrase}", 3 );
1326                    append( sb, "", 0 );
1327    
1328                    append( sb, "password", 2 );
1329                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1330                    append( sb, "Expression: ${password}", 3 );
1331                    append( sb, "", 0 );
1332    
1333                    append( sb, "privateKey", 2 );
1334                    append( sb, "The private key (used by java svn).", 3 );
1335                    append( sb, "Expression: ${privateKey}", 3 );
1336                    append( sb, "", 0 );
1337    
1338                    append( sb, "providerImplementations", 2 );
1339                    append( sb, "List of provider implementations.", 3 );
1340                    append( sb, "", 0 );
1341    
1342                    append( sb, "pushChanges (Default: true)", 2 );
1343                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1344                    append( sb, "Expression: ${pushChanges}", 3 );
1345                    append( sb, "", 0 );
1346    
1347                    append( sb, "systemProperties", 2 );
1348                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1349                    append( sb, "", 0 );
1350    
1351                    append( sb, "tagBase", 2 );
1352                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1353                    append( sb, "Expression: ${tagBase}", 3 );
1354                    append( sb, "", 0 );
1355    
1356                    append( sb, "username", 2 );
1357                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1358                    append( sb, "Expression: ${username}", 3 );
1359                    append( sb, "", 0 );
1360    
1361                    append( sb, "workingDirectory", 2 );
1362                    append( sb, "The working directory.", 3 );
1363                    append( sb, "Expression: ${workingDirectory}", 3 );
1364                    append( sb, "", 0 );
1365                }
1366            }
1367    
1368            if ( goal == null || goal.length() <= 0 || "status".equals( goal ) )
1369            {
1370                append( sb, "scm:status", 0 );
1371                append( sb, "Display the modification status of the files in the configured scm url.", 1 );
1372                append( sb, "", 0 );
1373                if ( detail )
1374                {
1375                    append( sb, "Available parameters:", 1 );
1376                    append( sb, "", 0 );
1377    
1378                    append( sb, "basedir", 2 );
1379                    append( sb, "The base directory.", 3 );
1380                    append( sb, "Required: Yes", 3 );
1381                    append( sb, "Expression: ${basedir}", 3 );
1382                    append( sb, "", 0 );
1383    
1384                    append( sb, "connectionType (Default: connection)", 2 );
1385                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1386                    append( sb, "Expression: ${connectionType}", 3 );
1387                    append( sb, "", 0 );
1388    
1389                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1390                    append( sb, "The SCM connection URL.", 3 );
1391                    append( sb, "Expression: ${connectionUrl}", 3 );
1392                    append( sb, "", 0 );
1393    
1394                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1395                    append( sb, "The SCM connection URL for developers.", 3 );
1396                    append( sb, "Expression: ${connectionUrl}", 3 );
1397                    append( sb, "", 0 );
1398    
1399                    append( sb, "excludes", 2 );
1400                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1401                    append( sb, "Expression: ${excludes}", 3 );
1402                    append( sb, "", 0 );
1403    
1404                    append( sb, "includes", 2 );
1405                    append( sb, "Comma separated list of includes file pattern.", 3 );
1406                    append( sb, "Expression: ${includes}", 3 );
1407                    append( sb, "", 0 );
1408    
1409                    append( sb, "passphrase", 2 );
1410                    append( sb, "The passphrase (used by java svn).", 3 );
1411                    append( sb, "Expression: ${passphrase}", 3 );
1412                    append( sb, "", 0 );
1413    
1414                    append( sb, "password", 2 );
1415                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1416                    append( sb, "Expression: ${password}", 3 );
1417                    append( sb, "", 0 );
1418    
1419                    append( sb, "privateKey", 2 );
1420                    append( sb, "The private key (used by java svn).", 3 );
1421                    append( sb, "Expression: ${privateKey}", 3 );
1422                    append( sb, "", 0 );
1423    
1424                    append( sb, "providerImplementations", 2 );
1425                    append( sb, "List of provider implementations.", 3 );
1426                    append( sb, "", 0 );
1427    
1428                    append( sb, "pushChanges (Default: true)", 2 );
1429                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1430                    append( sb, "Expression: ${pushChanges}", 3 );
1431                    append( sb, "", 0 );
1432    
1433                    append( sb, "systemProperties", 2 );
1434                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1435                    append( sb, "", 0 );
1436    
1437                    append( sb, "tagBase", 2 );
1438                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1439                    append( sb, "Expression: ${tagBase}", 3 );
1440                    append( sb, "", 0 );
1441    
1442                    append( sb, "username", 2 );
1443                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1444                    append( sb, "Expression: ${username}", 3 );
1445                    append( sb, "", 0 );
1446    
1447                    append( sb, "workingDirectory", 2 );
1448                    append( sb, "The working directory.", 3 );
1449                    append( sb, "Expression: ${workingDirectory}", 3 );
1450                    append( sb, "", 0 );
1451                }
1452            }
1453    
1454            if ( goal == null || goal.length() <= 0 || "tag".equals( goal ) )
1455            {
1456                append( sb, "scm:tag", 0 );
1457                append( sb, "Tag the project.", 1 );
1458                append( sb, "", 0 );
1459                if ( detail )
1460                {
1461                    append( sb, "Available parameters:", 1 );
1462                    append( sb, "", 0 );
1463    
1464                    append( sb, "addTimestamp (Default: false)", 2 );
1465                    append( sb, "Use timestamp tagging.", 3 );
1466                    append( sb, "Expression: ${addTimestamp}", 3 );
1467                    append( sb, "", 0 );
1468    
1469                    append( sb, "basedir", 2 );
1470                    append( sb, "The base directory.", 3 );
1471                    append( sb, "Required: Yes", 3 );
1472                    append( sb, "Expression: ${basedir}", 3 );
1473                    append( sb, "", 0 );
1474    
1475                    append( sb, "connectionType (Default: connection)", 2 );
1476                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1477                    append( sb, "Expression: ${connectionType}", 3 );
1478                    append( sb, "", 0 );
1479    
1480                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1481                    append( sb, "The SCM connection URL.", 3 );
1482                    append( sb, "Expression: ${connectionUrl}", 3 );
1483                    append( sb, "", 0 );
1484    
1485                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1486                    append( sb, "The SCM connection URL for developers.", 3 );
1487                    append( sb, "Expression: ${connectionUrl}", 3 );
1488                    append( sb, "", 0 );
1489    
1490                    append( sb, "excludes", 2 );
1491                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1492                    append( sb, "Expression: ${excludes}", 3 );
1493                    append( sb, "", 0 );
1494    
1495                    append( sb, "includes", 2 );
1496                    append( sb, "Comma separated list of includes file pattern.", 3 );
1497                    append( sb, "Expression: ${includes}", 3 );
1498                    append( sb, "", 0 );
1499    
1500                    append( sb, "message", 2 );
1501                    append( sb, "The message applied to the tag creation.", 3 );
1502                    append( sb, "Expression: ${message}", 3 );
1503                    append( sb, "", 0 );
1504    
1505                    append( sb, "passphrase", 2 );
1506                    append( sb, "The passphrase (used by java svn).", 3 );
1507                    append( sb, "Expression: ${passphrase}", 3 );
1508                    append( sb, "", 0 );
1509    
1510                    append( sb, "password", 2 );
1511                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1512                    append( sb, "Expression: ${password}", 3 );
1513                    append( sb, "", 0 );
1514    
1515                    append( sb, "privateKey", 2 );
1516                    append( sb, "The private key (used by java svn).", 3 );
1517                    append( sb, "Expression: ${privateKey}", 3 );
1518                    append( sb, "", 0 );
1519    
1520                    append( sb, "providerImplementations", 2 );
1521                    append( sb, "List of provider implementations.", 3 );
1522                    append( sb, "", 0 );
1523    
1524                    append( sb, "pushChanges (Default: true)", 2 );
1525                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1526                    append( sb, "Expression: ${pushChanges}", 3 );
1527                    append( sb, "", 0 );
1528    
1529                    append( sb, "remoteTagging (Default: true)", 2 );
1530                    append( sb, "currently only implemented with svn scm. Enable a workaround to prevent issue due to svn client > 1.5.0 (http://jira.codehaus.org/browse/SCM-406)", 3 );
1531                    append( sb, "Expression: ${remoteTagging}", 3 );
1532                    append( sb, "", 0 );
1533    
1534                    append( sb, "systemProperties", 2 );
1535                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1536                    append( sb, "", 0 );
1537    
1538                    append( sb, "tag", 2 );
1539                    append( sb, "The tag name.", 3 );
1540                    append( sb, "Required: Yes", 3 );
1541                    append( sb, "Expression: ${tag}", 3 );
1542                    append( sb, "", 0 );
1543    
1544                    append( sb, "tagBase", 2 );
1545                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1546                    append( sb, "Expression: ${tagBase}", 3 );
1547                    append( sb, "", 0 );
1548    
1549                    append( sb, "timestampFormat (Default: yyyyMMddHHmmss)", 2 );
1550                    append( sb, "Set the timestamp format.", 3 );
1551                    append( sb, "Expression: ${timestampFormat}", 3 );
1552                    append( sb, "", 0 );
1553    
1554                    append( sb, "timestampPosition (Default: end)", 2 );
1555                    append( sb, "Define the timestamp position (end or begin).", 3 );
1556                    append( sb, "Expression: ${timestampPosition}", 3 );
1557                    append( sb, "", 0 );
1558    
1559                    append( sb, "timestampPrefix (Default: -)", 2 );
1560                    append( sb, "Timestamp tag prefix.", 3 );
1561                    append( sb, "Expression: ${timestampPrefix}", 3 );
1562                    append( sb, "", 0 );
1563    
1564                    append( sb, "username", 2 );
1565                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1566                    append( sb, "Expression: ${username}", 3 );
1567                    append( sb, "", 0 );
1568    
1569                    append( sb, "workingDirectory", 2 );
1570                    append( sb, "The working directory.", 3 );
1571                    append( sb, "Expression: ${workingDirectory}", 3 );
1572                    append( sb, "", 0 );
1573                }
1574            }
1575    
1576            if ( goal == null || goal.length() <= 0 || "unedit".equals( goal ) )
1577            {
1578                append( sb, "scm:unedit", 0 );
1579                append( sb, "Unedit/unlock a set of files.", 1 );
1580                append( sb, "", 0 );
1581                if ( detail )
1582                {
1583                    append( sb, "Available parameters:", 1 );
1584                    append( sb, "", 0 );
1585    
1586                    append( sb, "basedir", 2 );
1587                    append( sb, "The base directory.", 3 );
1588                    append( sb, "Required: Yes", 3 );
1589                    append( sb, "Expression: ${basedir}", 3 );
1590                    append( sb, "", 0 );
1591    
1592                    append( sb, "connectionType (Default: connection)", 2 );
1593                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1594                    append( sb, "Expression: ${connectionType}", 3 );
1595                    append( sb, "", 0 );
1596    
1597                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1598                    append( sb, "The SCM connection URL.", 3 );
1599                    append( sb, "Expression: ${connectionUrl}", 3 );
1600                    append( sb, "", 0 );
1601    
1602                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1603                    append( sb, "The SCM connection URL for developers.", 3 );
1604                    append( sb, "Expression: ${connectionUrl}", 3 );
1605                    append( sb, "", 0 );
1606    
1607                    append( sb, "excludes", 2 );
1608                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1609                    append( sb, "Expression: ${excludes}", 3 );
1610                    append( sb, "", 0 );
1611    
1612                    append( sb, "includes", 2 );
1613                    append( sb, "Comma separated list of includes file pattern.", 3 );
1614                    append( sb, "Expression: ${includes}", 3 );
1615                    append( sb, "", 0 );
1616    
1617                    append( sb, "passphrase", 2 );
1618                    append( sb, "The passphrase (used by java svn).", 3 );
1619                    append( sb, "Expression: ${passphrase}", 3 );
1620                    append( sb, "", 0 );
1621    
1622                    append( sb, "password", 2 );
1623                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1624                    append( sb, "Expression: ${password}", 3 );
1625                    append( sb, "", 0 );
1626    
1627                    append( sb, "privateKey", 2 );
1628                    append( sb, "The private key (used by java svn).", 3 );
1629                    append( sb, "Expression: ${privateKey}", 3 );
1630                    append( sb, "", 0 );
1631    
1632                    append( sb, "providerImplementations", 2 );
1633                    append( sb, "List of provider implementations.", 3 );
1634                    append( sb, "", 0 );
1635    
1636                    append( sb, "pushChanges (Default: true)", 2 );
1637                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1638                    append( sb, "Expression: ${pushChanges}", 3 );
1639                    append( sb, "", 0 );
1640    
1641                    append( sb, "systemProperties", 2 );
1642                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1643                    append( sb, "", 0 );
1644    
1645                    append( sb, "tagBase", 2 );
1646                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1647                    append( sb, "Expression: ${tagBase}", 3 );
1648                    append( sb, "", 0 );
1649    
1650                    append( sb, "username", 2 );
1651                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1652                    append( sb, "Expression: ${username}", 3 );
1653                    append( sb, "", 0 );
1654    
1655                    append( sb, "workingDirectory", 2 );
1656                    append( sb, "The working directory.", 3 );
1657                    append( sb, "Expression: ${workingDirectory}", 3 );
1658                    append( sb, "", 0 );
1659                }
1660            }
1661    
1662            if ( goal == null || goal.length() <= 0 || "update".equals( goal ) )
1663            {
1664                append( sb, "scm:update", 0 );
1665                append( sb, "Update the local working copy with the latest source from the configured scm url.", 1 );
1666                append( sb, "", 0 );
1667                if ( detail )
1668                {
1669                    append( sb, "Available parameters:", 1 );
1670                    append( sb, "", 0 );
1671    
1672                    append( sb, "basedir", 2 );
1673                    append( sb, "The base directory.", 3 );
1674                    append( sb, "Required: Yes", 3 );
1675                    append( sb, "Expression: ${basedir}", 3 );
1676                    append( sb, "", 0 );
1677    
1678                    append( sb, "connectionType (Default: connection)", 2 );
1679                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1680                    append( sb, "Expression: ${connectionType}", 3 );
1681                    append( sb, "", 0 );
1682    
1683                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1684                    append( sb, "The SCM connection URL.", 3 );
1685                    append( sb, "Expression: ${connectionUrl}", 3 );
1686                    append( sb, "", 0 );
1687    
1688                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1689                    append( sb, "The SCM connection URL for developers.", 3 );
1690                    append( sb, "Expression: ${connectionUrl}", 3 );
1691                    append( sb, "", 0 );
1692    
1693                    append( sb, "excludes", 2 );
1694                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1695                    append( sb, "Expression: ${excludes}", 3 );
1696                    append( sb, "", 0 );
1697    
1698                    append( sb, "includes", 2 );
1699                    append( sb, "Comma separated list of includes file pattern.", 3 );
1700                    append( sb, "Expression: ${includes}", 3 );
1701                    append( sb, "", 0 );
1702    
1703                    append( sb, "passphrase", 2 );
1704                    append( sb, "The passphrase (used by java svn).", 3 );
1705                    append( sb, "Expression: ${passphrase}", 3 );
1706                    append( sb, "", 0 );
1707    
1708                    append( sb, "password", 2 );
1709                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1710                    append( sb, "Expression: ${password}", 3 );
1711                    append( sb, "", 0 );
1712    
1713                    append( sb, "privateKey", 2 );
1714                    append( sb, "The private key (used by java svn).", 3 );
1715                    append( sb, "Expression: ${privateKey}", 3 );
1716                    append( sb, "", 0 );
1717    
1718                    append( sb, "providerImplementations", 2 );
1719                    append( sb, "List of provider implementations.", 3 );
1720                    append( sb, "", 0 );
1721    
1722                    append( sb, "pushChanges (Default: true)", 2 );
1723                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1724                    append( sb, "Expression: ${pushChanges}", 3 );
1725                    append( sb, "", 0 );
1726    
1727                    append( sb, "revisionKey (Default: scm.revision)", 2 );
1728                    append( sb, "The project property where to store the revision name.", 3 );
1729                    append( sb, "Expression: ${revisionKey}", 3 );
1730                    append( sb, "", 0 );
1731    
1732                    append( sb, "runChangelog (Default: false)", 2 );
1733                    append( sb, "Run Changelog after update.", 3 );
1734                    append( sb, "Expression: ${runChangelog}", 3 );
1735                    append( sb, "", 0 );
1736    
1737                    append( sb, "scmVersion", 2 );
1738                    append( sb, "The version (revision number/branch name/tag name).", 3 );
1739                    append( sb, "Expression: ${scmVersion}", 3 );
1740                    append( sb, "", 0 );
1741    
1742                    append( sb, "scmVersionType", 2 );
1743                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
1744                    append( sb, "Expression: ${scmVersionType}", 3 );
1745                    append( sb, "", 0 );
1746    
1747                    append( sb, "systemProperties", 2 );
1748                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1749                    append( sb, "", 0 );
1750    
1751                    append( sb, "tagBase", 2 );
1752                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1753                    append( sb, "Expression: ${tagBase}", 3 );
1754                    append( sb, "", 0 );
1755    
1756                    append( sb, "username", 2 );
1757                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1758                    append( sb, "Expression: ${username}", 3 );
1759                    append( sb, "", 0 );
1760    
1761                    append( sb, "workingDirectory", 2 );
1762                    append( sb, "The working directory.", 3 );
1763                    append( sb, "Expression: ${workingDirectory}", 3 );
1764                    append( sb, "", 0 );
1765                }
1766            }
1767    
1768            if ( goal == null || goal.length() <= 0 || "update-subprojects".equals( goal ) )
1769            {
1770                append( sb, "scm:update-subprojects", 0 );
1771                append( sb, "Updates all projects in a multi project build. This is useful for users who have adopted the flat project structure where the aggregator project is a sibling of the sub projects rather than sitting in the parent directory.", 1 );
1772                append( sb, "", 0 );
1773                if ( detail )
1774                {
1775                    append( sb, "Available parameters:", 1 );
1776                    append( sb, "", 0 );
1777    
1778                    append( sb, "basedir", 2 );
1779                    append( sb, "The base directory.", 3 );
1780                    append( sb, "Required: Yes", 3 );
1781                    append( sb, "Expression: ${basedir}", 3 );
1782                    append( sb, "", 0 );
1783    
1784                    append( sb, "connectionType (Default: connection)", 2 );
1785                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1786                    append( sb, "Expression: ${connectionType}", 3 );
1787                    append( sb, "", 0 );
1788    
1789                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1790                    append( sb, "The SCM connection URL.", 3 );
1791                    append( sb, "Expression: ${connectionUrl}", 3 );
1792                    append( sb, "", 0 );
1793    
1794                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1795                    append( sb, "The SCM connection URL for developers.", 3 );
1796                    append( sb, "Expression: ${connectionUrl}", 3 );
1797                    append( sb, "", 0 );
1798    
1799                    append( sb, "excludes", 2 );
1800                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1801                    append( sb, "Expression: ${excludes}", 3 );
1802                    append( sb, "", 0 );
1803    
1804                    append( sb, "includes", 2 );
1805                    append( sb, "Comma separated list of includes file pattern.", 3 );
1806                    append( sb, "Expression: ${includes}", 3 );
1807                    append( sb, "", 0 );
1808    
1809                    append( sb, "passphrase", 2 );
1810                    append( sb, "The passphrase (used by java svn).", 3 );
1811                    append( sb, "Expression: ${passphrase}", 3 );
1812                    append( sb, "", 0 );
1813    
1814                    append( sb, "password", 2 );
1815                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1816                    append( sb, "Expression: ${password}", 3 );
1817                    append( sb, "", 0 );
1818    
1819                    append( sb, "privateKey", 2 );
1820                    append( sb, "The private key (used by java svn).", 3 );
1821                    append( sb, "Expression: ${privateKey}", 3 );
1822                    append( sb, "", 0 );
1823    
1824                    append( sb, "providerImplementations", 2 );
1825                    append( sb, "List of provider implementations.", 3 );
1826                    append( sb, "", 0 );
1827    
1828                    append( sb, "pushChanges (Default: true)", 2 );
1829                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1830                    append( sb, "Expression: ${pushChanges}", 3 );
1831                    append( sb, "", 0 );
1832    
1833                    append( sb, "revisionKey (Default: scm.revision)", 2 );
1834                    append( sb, "The project property where to store the revision name.", 3 );
1835                    append( sb, "Expression: ${revisionKey}", 3 );
1836                    append( sb, "", 0 );
1837    
1838                    append( sb, "scmVersion", 2 );
1839                    append( sb, "The version (revision number/branch name/tag name).", 3 );
1840                    append( sb, "Expression: ${scmVersion}", 3 );
1841                    append( sb, "", 0 );
1842    
1843                    append( sb, "scmVersionType", 2 );
1844                    append( sb, "The version type (branch/tag/revision) of scmVersion.", 3 );
1845                    append( sb, "Expression: ${scmVersionType}", 3 );
1846                    append( sb, "", 0 );
1847    
1848                    append( sb, "systemProperties", 2 );
1849                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1850                    append( sb, "", 0 );
1851    
1852                    append( sb, "tagBase", 2 );
1853                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1854                    append( sb, "Expression: ${tagBase}", 3 );
1855                    append( sb, "", 0 );
1856    
1857                    append( sb, "username", 2 );
1858                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1859                    append( sb, "Expression: ${username}", 3 );
1860                    append( sb, "", 0 );
1861    
1862                    append( sb, "workingDirectory", 2 );
1863                    append( sb, "The working directory.", 3 );
1864                    append( sb, "Expression: ${workingDirectory}", 3 );
1865                    append( sb, "", 0 );
1866                }
1867            }
1868    
1869            if ( goal == null || goal.length() <= 0 || "validate".equals( goal ) )
1870            {
1871                append( sb, "scm:validate", 0 );
1872                append( sb, "Validate scm connection string.", 1 );
1873                append( sb, "", 0 );
1874                if ( detail )
1875                {
1876                    append( sb, "Available parameters:", 1 );
1877                    append( sb, "", 0 );
1878    
1879                    append( sb, "basedir", 2 );
1880                    append( sb, "The base directory.", 3 );
1881                    append( sb, "Required: Yes", 3 );
1882                    append( sb, "Expression: ${basedir}", 3 );
1883                    append( sb, "", 0 );
1884    
1885                    append( sb, "connectionType (Default: connection)", 2 );
1886                    append( sb, "The type of connection to use (connection or developerConnection).", 3 );
1887                    append( sb, "Expression: ${connectionType}", 3 );
1888                    append( sb, "", 0 );
1889    
1890                    append( sb, "connectionUrl (Default: ${project.scm.connection})", 2 );
1891                    append( sb, "The SCM connection URL.", 3 );
1892                    append( sb, "Expression: ${connectionUrl}", 3 );
1893                    append( sb, "", 0 );
1894    
1895                    append( sb, "developerConnectionUrl (Default: ${project.scm.developerConnection})", 2 );
1896                    append( sb, "The SCM connection URL for developers.", 3 );
1897                    append( sb, "Expression: ${connectionUrl}", 3 );
1898                    append( sb, "", 0 );
1899    
1900                    append( sb, "excludes", 2 );
1901                    append( sb, "Comma separated list of excludes file pattern.", 3 );
1902                    append( sb, "Expression: ${excludes}", 3 );
1903                    append( sb, "", 0 );
1904    
1905                    append( sb, "includes", 2 );
1906                    append( sb, "Comma separated list of includes file pattern.", 3 );
1907                    append( sb, "Expression: ${includes}", 3 );
1908                    append( sb, "", 0 );
1909    
1910                    append( sb, "passphrase", 2 );
1911                    append( sb, "The passphrase (used by java svn).", 3 );
1912                    append( sb, "Expression: ${passphrase}", 3 );
1913                    append( sb, "", 0 );
1914    
1915                    append( sb, "password", 2 );
1916                    append( sb, "The user password (used by svn, starteam and perforce protocol).", 3 );
1917                    append( sb, "Expression: ${password}", 3 );
1918                    append( sb, "", 0 );
1919    
1920                    append( sb, "privateKey", 2 );
1921                    append( sb, "The private key (used by java svn).", 3 );
1922                    append( sb, "Expression: ${privateKey}", 3 );
1923                    append( sb, "", 0 );
1924    
1925                    append( sb, "providerImplementations", 2 );
1926                    append( sb, "List of provider implementations.", 3 );
1927                    append( sb, "", 0 );
1928    
1929                    append( sb, "pushChanges (Default: true)", 2 );
1930                    append( sb, "Should distributed changes be pushed to the central repository? For many distributed SCMs like Git, a change like a commit is only stored in your local copy of the repository. Pushing the change allows your to more easily share it with other users.", 3 );
1931                    append( sb, "Expression: ${pushChanges}", 3 );
1932                    append( sb, "", 0 );
1933    
1934                    append( sb, "scmConnection (Default: ${project.scm.connection})", 2 );
1935                    append( sb, "The scm connection url.", 3 );
1936                    append( sb, "Expression: ${scmConnection}", 3 );
1937                    append( sb, "", 0 );
1938    
1939                    append( sb, "scmDeveloperConnection (Default: ${project.scm.developerConnection})", 2 );
1940                    append( sb, "The scm connection url for developers.", 3 );
1941                    append( sb, "Expression: ${scmDeveloperConnection}", 3 );
1942                    append( sb, "", 0 );
1943    
1944                    append( sb, "systemProperties", 2 );
1945                    append( sb, "List of System properties to pass to the JUnit tests.", 3 );
1946                    append( sb, "", 0 );
1947    
1948                    append( sb, "tagBase", 2 );
1949                    append( sb, "The url of tags base directory (used by svn protocol). It is not necessary to set it if you use the standard svn layout (branches/tags/trunk).", 3 );
1950                    append( sb, "Expression: ${tagBase}", 3 );
1951                    append( sb, "", 0 );
1952    
1953                    append( sb, "username", 2 );
1954                    append( sb, "The user name (used by svn, starteam and perforce protocol).", 3 );
1955                    append( sb, "Expression: ${username}", 3 );
1956                    append( sb, "", 0 );
1957    
1958                    append( sb, "workingDirectory", 2 );
1959                    append( sb, "The working directory.", 3 );
1960                    append( sb, "Expression: ${workingDirectory}", 3 );
1961                    append( sb, "", 0 );
1962                }
1963            }
1964    
1965            if ( getLog().isInfoEnabled() )
1966            {
1967                getLog().info( sb.toString() );
1968            }
1969        }
1970    
1971        /**
1972         * <p>Repeat a String <code>n</code> times to form a new string.</p>
1973         *
1974         * @param str String to repeat
1975         * @param repeat number of times to repeat str
1976         * @return String with repeated String
1977         * @throws NegativeArraySizeException if <code>repeat < 0</code>
1978         * @throws NullPointerException if str is <code>null</code>
1979         */
1980        private static String repeat( String str, int repeat )
1981        {
1982            StringBuffer buffer = new StringBuffer( repeat * str.length() );
1983    
1984            for ( int i = 0; i < repeat; i++ )
1985            {
1986                buffer.append( str );
1987            }
1988    
1989            return buffer.toString();
1990        }
1991    
1992        /** 
1993         * Append a description to the buffer by respecting the indentSize and lineLength parameters.
1994         * <b>Note</b>: The last character is always a new line.
1995         * 
1996         * @param sb The buffer to append the description, not <code>null</code>.
1997         * @param description The description, not <code>null</code>.
1998         * @param indent The base indentation level of each line, must not be negative.
1999         */
2000        private void append( StringBuffer sb, String description, int indent )
2001        {
2002            for ( Iterator it = toLines( description, indent, indentSize, lineLength ).iterator(); it.hasNext(); )
2003            {
2004                sb.append( it.next().toString() ).append( '\n' );
2005            }
2006        }
2007    
2008        /** 
2009         * Splits the specified text into lines of convenient display length.
2010         * 
2011         * @param text The text to split into lines, must not be <code>null</code>.
2012         * @param indent The base indentation level of each line, must not be negative.
2013         * @param indentSize The size of each indentation, must not be negative.
2014         * @param lineLength The length of the line, must not be negative.
2015         * @return The sequence of display lines, never <code>null</code>.
2016         * @throws NegativeArraySizeException if <code>indent < 0</code>
2017         */
2018        private static List toLines( String text, int indent, int indentSize, int lineLength )
2019        {
2020            List<String> lines = new ArrayList<String>();
2021    
2022            String ind = repeat( "\t", indent );
2023            String[] plainLines = text.split( "(\r\n)|(\r)|(\n)" );
2024            for ( int i = 0; i < plainLines.length; i++ )
2025            {
2026                toLines( lines, ind + plainLines[i], indentSize, lineLength );
2027            }
2028    
2029            return lines;
2030        }
2031    
2032        /** 
2033         * Adds the specified line to the output sequence, performing line wrapping if necessary.
2034         * 
2035         * @param lines The sequence of display lines, must not be <code>null</code>.
2036         * @param line The line to add, must not be <code>null</code>.
2037         * @param indentSize The size of each indentation, must not be negative.
2038         * @param lineLength The length of the line, must not be negative.
2039         */
2040        private static void toLines( List<String> lines, String line, int indentSize, int lineLength )
2041        {
2042            int lineIndent = getIndentLevel( line );
2043            StringBuffer buf = new StringBuffer( 256 );
2044            String[] tokens = line.split( " +" );
2045            for ( int i = 0; i < tokens.length; i++ )
2046            {
2047                String token = tokens[i];
2048                if ( i > 0 )
2049                {
2050                    if ( buf.length() + token.length() >= lineLength )
2051                    {
2052                        lines.add( buf.toString() );
2053                        buf.setLength( 0 );
2054                        buf.append( repeat( " ", lineIndent * indentSize ) );
2055                    }
2056                    else
2057                    {
2058                        buf.append( ' ' );
2059                    }
2060                }
2061                for ( int j = 0; j < token.length(); j++ )
2062                {
2063                    char c = token.charAt( j );
2064                    if ( c == '\t' )
2065                    {
2066                        buf.append( repeat( " ", indentSize - buf.length() % indentSize ) );
2067                    }
2068                    else if ( c == '\u00A0' )
2069                    {
2070                        buf.append( ' ' );
2071                    }
2072                    else
2073                    {
2074                        buf.append( c );
2075                    }
2076                }
2077            }
2078            lines.add( buf.toString() );
2079        }
2080    
2081        /** 
2082         * Gets the indentation level of the specified line.
2083         * 
2084         * @param line The line whose indentation level should be retrieved, must not be <code>null</code>.
2085         * @return The indentation level of the line.
2086         */
2087        private static int getIndentLevel( String line )
2088        {
2089            int level = 0;
2090            for ( int i = 0; i < line.length() && line.charAt( i ) == '\t'; i++ )
2091            {
2092                level++;
2093            }
2094            for ( int i = level + 1; i <= level + 4 && i < line.length(); i++ )
2095            {
2096                if ( line.charAt( i ) == '\t' )
2097                {
2098                    level++;
2099                    break;
2100                }
2101            }
2102            return level;
2103        }
2104    }