View Javadoc

1   package org.apache.maven.scm.plugin;
2   
3   import java.util.ArrayList;
4   import java.util.Iterator;
5   import java.util.List;
6   
7   import org.apache.maven.plugin.AbstractMojo;
8   import org.apache.maven.plugin.MojoExecutionException;
9   
10  /**
11   * 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.
12   *
13   * @version generated on Wed Nov 07 19:53:12 GMT 2012
14   * @author org.apache.maven.tools.plugin.generator.PluginHelpGenerator (version 2.9)
15   * @goal help
16   * @requiresProject false
17   * @threadSafe
18   */
19  @SuppressWarnings( "all" )
20  public class HelpMojo
21      extends AbstractMojo
22  {
23      /**
24       * If <code>true</code>, display all settable properties for each goal.
25       * 
26       * @parameter expression="${detail}" default-value="false"
27       */
28      private boolean detail;
29  
30      /**
31       * The name of the goal for which to show help. If unspecified, all goals will be displayed.
32       * 
33       * @parameter expression="${goal}"
34       */
35      private java.lang.String goal;
36  
37      /**
38       * The maximum length of a display line, should be positive.
39       * 
40       * @parameter expression="${lineLength}" default-value="80"
41       */
42      private int lineLength;
43  
44      /**
45       * The number of spaces per indentation level, should be positive.
46       * 
47       * @parameter expression="${indentSize}" default-value="2"
48       */
49      private int indentSize;
50  
51  
52      /** {@inheritDoc} */
53      public void execute()
54          throws MojoExecutionException
55      {
56          if ( lineLength <= 0 )
57          {
58              getLog().warn( "The parameter 'lineLength' should be positive, using '80' as default." );
59              lineLength = 80;
60          }
61          if ( indentSize <= 0 )
62          {
63              getLog().warn( "The parameter 'indentSize' should be positive, using '2' as default." );
64              indentSize = 2;
65          }
66  
67          StringBuffer sb = new StringBuffer();
68  
69          append( sb, "org.apache.maven.plugins:maven-scm-plugin:1.8.1", 0 );
70          append( sb, "", 0 );
71  
72          append( sb, "Maven SCM Plugin", 0 );
73          append( sb, "Maven Plugin that allows accessing different SCMs.", 1 );
74          append( sb, "", 0 );
75  
76          if ( goal == null || goal.length() <= 0 )
77          {
78              append( sb, "This plugin has 19 goals:", 0 );
79              append( sb, "", 0 );
80          }
81  
82          if ( goal == null || goal.length() <= 0 || "add".equals( goal ) )
83          {
84              append( sb, "scm:add", 0 );
85              append( sb, "Add a file set to the project.", 1 );
86              append( sb, "", 0 );
87              if ( detail )
88              {
89                  append( sb, "Available parameters:", 1 );
90                  append( sb, "", 0 );
91  
92                  append( sb, "basedir", 2 );
93                  append( sb, "The base directory.", 3 );
94                  append( sb, "Required: Yes", 3 );
95                  append( sb, "Expression: ${basedir}", 3 );
96                  append( sb, "", 0 );
97  
98                  append( sb, "connectionType (Default: connection)", 2 );
99                  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 }