001package org.apache.maven.scm.provider;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 * http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.maven.scm.CommandParameters;
023import org.apache.maven.scm.ScmBranch;
024import org.apache.maven.scm.ScmBranchParameters;
025import org.apache.maven.scm.ScmException;
026import org.apache.maven.scm.ScmFileSet;
027import org.apache.maven.scm.ScmTagParameters;
028import org.apache.maven.scm.ScmVersion;
029import org.apache.maven.scm.command.add.AddScmResult;
030import org.apache.maven.scm.command.blame.BlameScmRequest;
031import org.apache.maven.scm.command.blame.BlameScmResult;
032import org.apache.maven.scm.command.branch.BranchScmResult;
033import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
034import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
035import org.apache.maven.scm.command.checkin.CheckInScmResult;
036import org.apache.maven.scm.command.checkout.CheckOutScmResult;
037import org.apache.maven.scm.command.diff.DiffScmResult;
038import org.apache.maven.scm.command.edit.EditScmResult;
039import org.apache.maven.scm.command.export.ExportScmResult;
040import org.apache.maven.scm.command.info.InfoScmResult;
041import org.apache.maven.scm.command.list.ListScmResult;
042import org.apache.maven.scm.command.mkdir.MkdirScmResult;
043import org.apache.maven.scm.command.remoteinfo.RemoteInfoScmResult;
044import org.apache.maven.scm.command.remove.RemoveScmResult;
045import org.apache.maven.scm.command.status.StatusScmResult;
046import org.apache.maven.scm.command.tag.TagScmResult;
047import org.apache.maven.scm.command.unedit.UnEditScmResult;
048import org.apache.maven.scm.command.untag.UntagScmResult;
049import org.apache.maven.scm.command.update.UpdateScmResult;
050import org.apache.maven.scm.log.ScmLogger;
051import org.apache.maven.scm.repository.ScmRepository;
052import org.apache.maven.scm.repository.ScmRepositoryException;
053import org.apache.maven.scm.repository.UnknownRepositoryStructure;
054
055import java.io.File;
056import java.util.Date;
057import java.util.List;
058
059/**
060 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
061 *
062 */
063public interface ScmProvider
064{
065    String ROLE = ScmProvider.class.getName();
066
067    String getScmType();
068
069    /**
070     * Add a logger listener.
071     *
072     * @param logger The logger
073     */
074    void addListener( ScmLogger logger );
075
076    boolean requiresEditMode();
077
078    ScmProviderRepository makeProviderScmRepository( String scmSpecificUrl, char delimiter )
079        throws ScmRepositoryException;
080
081    ScmProviderRepository makeProviderScmRepository( File path )
082        throws ScmRepositoryException, UnknownRepositoryStructure;
083
084    /**
085     * Validate the scm url.
086     *
087     * @param scmSpecificUrl The SCM url
088     * @param delimiter      The delimiter used in the SCM url
089     * @return Returns a list of messages if the validation failed
090     */
091    List<String> validateScmUrl( String scmSpecificUrl, char delimiter );
092
093    /**
094     * Returns the scm reserved file name where the SCM stores information like 'CVS', '.svn'.
095     *
096     * @return the scm reserved file name
097     */
098    String getScmSpecificFilename();
099
100    /**
101     * Check if this tag is valid for this SCM provider.
102     *
103     * @param tag tag name to check
104     * @return true if tag is valid
105     */
106    boolean validateTagName( String tag );
107
108    /**
109     * Given a tag name, make it suitable for this SCM provider. For example, CVS converts "." into "_"
110     *
111     * @param tag input tag name
112     * @return sanitized tag name
113     */
114    String sanitizeTagName( String tag );
115
116    /**
117     * Adds the given files to the source control system
118     *
119     * @param repository the source control system
120     * @param fileSet    the files to be added
121     * @return an {@link AddScmResult} that contains the files that have been added
122     * @throws ScmException if any
123     */
124    AddScmResult add( ScmRepository repository, ScmFileSet fileSet )
125        throws ScmException;
126
127    /**
128     * Adds the given files to the source control system
129     *
130     * @param repository the source control system
131     * @param fileSet    the files to be added
132     * @param message    a string that is a comment on the new added file
133     * @return an {@link AddScmResult} that contains the files that have been added
134     * @throws ScmException if any
135     */
136    AddScmResult add( ScmRepository repository, ScmFileSet fileSet, String message )
137        throws ScmException;
138
139    /**
140     * Adds the given files to the source control system
141     *
142     * @param repository        the source control system
143     * @param fileSet           the files to be added
144     * @param commandParameters {@link CommandParameters}
145     * @return an {@link AddScmResult} that contains the files that have been added
146     * @throws ScmException if any
147     */
148    AddScmResult add( ScmRepository repository, ScmFileSet fileSet, CommandParameters commandParameters )
149        throws ScmException;
150
151    /**
152     * Branch (or label in some systems) will create a branch of the source file with a certain branch name
153     *
154     * @param repository the source control system
155     * @param fileSet    the files to branch. Implementations can also give the changes
156     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
157     * @param branchName the branch name to apply to the files
158     * @return TODO
159     * @throws ScmException if any
160     * @deprecated use {@link #branch(ScmRepository, ScmFileSet, String, ScmBranchParameters)}
161     */
162    BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName )
163        throws ScmException;
164
165    /**
166     * Branch (or label in some systems) will create a branch of the source file with a certain branch name
167     *
168     * @param repository the source control system
169     * @param fileSet    the files to branch. Implementations can also give the changes
170     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
171     * @param branchName the branch name to apply to the files
172     * @param message    the commit message used for the tag creation
173     * @return TODO
174     * @throws ScmException if any
175     * @deprecated use {@link #branch(ScmRepository, ScmFileSet, String, ScmBranchParameters)}
176     */
177    BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName, String message )
178        throws ScmException;
179
180    /**
181     * Branch (or label in some systems) will create a branch of the source file with a certain
182     * branch name
183     *
184     * @param repository the source control system
185     * @param fileSet    the files to branch. Implementations can also give the changes from the
186     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
187     * @param branchName the branch name to apply to the files
188     * @param scmBranchParameters TODO
189     * @return TODO
190     * @throws ScmException if any
191     * @since 1.3
192     */
193    BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName,
194                            ScmBranchParameters scmBranchParameters )
195        throws ScmException;
196
197    /**
198     * Returns the changes that have happened in the source control system in a certain period of time.
199     * This can be adding, removing, updating, ... of files
200     *
201     * @param repository the source control system
202     * @param fileSet    the files to know the changes about. Implementations can also give the changes
203     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
204     * @param startDate  the start date of the period
205     * @param endDate    the end date of the period
206     * @param numDays    the number days before the current time if startdate and enddate are null
207     * @param branch     the branch/tag name
208     * @return The SCM result of the changelog command
209     * @throws ScmException if any
210     * @deprecated you must use {@link ScmProvider#changeLog(org.apache.maven.scm.repository.ScmRepository,
211     *             org.apache.maven.scm.ScmFileSet, java.util.Date, java.util.Date, int,
212     *             org.apache.maven.scm.ScmBranch)}
213     */
214    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
215                                  int numDays, String branch )
216        throws ScmException;
217
218    /**
219     * Returns the changes that have happened in the source control system in a certain period of time.
220     * This can be adding, removing, updating, ... of files
221     *
222     * @param repository the source control system
223     * @param fileSet    the files to know the changes about. Implementations can also give the changes
224     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
225     * @param startDate  the start date of the period
226     * @param endDate    the end date of the period
227     * @param numDays    the number days before the current time if startdate and enddate are null
228     * @param branch     the branch/tag
229     * @return The SCM result of the changelog command
230     * @throws ScmException if any
231     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
232     */
233    @Deprecated
234    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
235                                  int numDays, ScmBranch branch )
236        throws ScmException;
237
238    /**
239     * Returns the changes that have happened in the source control system in a certain period of time.
240     * This can be adding, removing, updating, ... of files
241     *
242     * @param repository  the source control system
243     * @param fileSet     the files to know the changes about. Implementations can also give the changes
244     *                    from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
245     * @param startDate   the start date of the period
246     * @param endDate     the end date of the period
247     * @param numDays     the number days before the current time if startdate and enddate are null
248     * @param branch      the branch/tag name
249     * @param datePattern the date pattern use in changelog output returned by scm tool
250     * @return The SCM result of the changelog command
251     * @throws ScmException if any
252     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
253     */
254    @Deprecated
255    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
256                                  int numDays, String branch, String datePattern )
257        throws ScmException;
258
259    /**
260     * Returns the changes that have happened in the source control system in a certain period of time.
261     * This can be adding, removing, updating, ... of files
262     *
263     * @param repository  the source control system
264     * @param fileSet     the files to know the changes about. Implementations can also give the changes
265     *                    from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
266     * @param startDate   the start date of the period
267     * @param endDate     the end date of the period
268     * @param numDays     the number days before the current time if startDate and endDate are null
269     * @param branch      the branch/tag
270     * @param datePattern the date pattern use in changelog output returned by scm tool
271     * @return The SCM result of the changelog command
272     * @throws ScmException if any
273     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
274     */
275    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
276                                  int numDays, ScmBranch branch, String datePattern )
277        throws ScmException;
278
279    /**
280     * Returns the changes that have happened in the source control system in a certain period of time.
281     * This can be adding, removing, updating, ... of files
282     *
283     * @param scmRequest request wrapping detailed parameters for the changelog command
284     * @return The SCM result of the changelog command
285     * @throws ScmException if any
286     * @since 1.8
287     */
288    ChangeLogScmResult changeLog( ChangeLogScmRequest scmRequest )
289        throws ScmException;
290
291    /**
292     * Returns the changes that have happened in the source control system between two tags.
293     * This can be adding, removing, updating, ... of files
294     *
295     * @param repository the source control system
296     * @param fileSet    the files to know the changes about. Implementations can also give the changes
297     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
298     * @param startTag   the start tag
299     * @param endTag     the end tag
300     * @return The SCM result of the changelog command
301     * @throws ScmException if any
302     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
303     */
304    @Deprecated
305    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, String startTag, String endTag )
306        throws ScmException;
307
308    /**
309     * Returns the changes that have happened in the source control system between two tags.
310     * This can be adding, removing, updating, ... of files
311     *
312     * @param repository   the source control system
313     * @param fileSet      the files to know the changes about. Implementations can also give the changes
314     *                     from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
315     * @param startVersion the start branch/tag/revision
316     * @param endVersion   the end branch/tag/revision
317     * @return The SCM result of the changelog command
318     * @throws ScmException if any
319     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
320     */
321    @Deprecated
322    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startVersion,
323                                  ScmVersion endVersion )
324        throws ScmException;
325
326    /**
327     * Returns the changes that have happened in the source control system between two tags.
328     * This can be adding, removing, updating, ... of files
329     *
330     * @param repository  the source control system
331     * @param fileSet     the files to know the changes about. Implementations can also give the changes
332     *                    from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
333     * @param startTag    the start tag
334     * @param endTag      the end tag
335     * @param datePattern the date pattern use in changelog output returned by scm tool
336     * @return TODO
337     * @throws ScmException if any
338     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
339     */
340    @Deprecated
341    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, String startTag, String endTag,
342                                  String datePattern )
343        throws ScmException;
344
345    /**
346     * Returns the changes that have happened in the source control system between two tags.
347     * This can be adding, removing, updating, ... of files
348     *
349     * @param repository    the source control system
350     * @param fileSet       the files to know the changes about. Implementations can also give the changes
351     *                      from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
352     * @param startRevision the start revision
353     * @param endRevision   the end revision
354     * @param datePattern   the date pattern use in changelog output returned by scm tool
355     * @return TODO
356     * @throws ScmException if any
357     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
358     */
359    @Deprecated
360    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startRevision,
361                                  ScmVersion endRevision, String datePattern )
362        throws ScmException;
363
364    /**
365     * Save the changes you have done into the repository. This will create a new version of the file or
366     * directory in the repository.
367     * <p>
368     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed.
369     * When the fileSet has entries, the commit is non-recursive and only the elements in the fileSet
370     * are committed.
371     *
372     * @param repository the source control system
373     * @param fileSet    the files to check in (sometimes called commit)
374     * @param tag        tag or revision
375     * @param message    a string that is a comment on the changes that where done
376     * @return TODO
377     * @throws ScmException if any
378     * @deprecated you must use {@link ScmProvider#checkIn(org.apache.maven.scm.repository.ScmRepository,
379     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, String)}
380     */
381    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, String tag, String message )
382        throws ScmException;
383
384    /**
385     * Save the changes you have done into the repository. This will create a new version of the file or
386     * directory in the repository.
387     * <p>
388     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed.
389     * When the fileSet has entries, the commit is non-recursive and only the elements in the fileSet
390     * are committed.
391     *
392     * @param repository the source control system
393     * @param fileSet    the files to check in (sometimes called commit)
394     * @param message    a string that is a comment on the changes that where done
395     * @return TODO
396     * @throws ScmException if any
397     */
398    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, String message )
399        throws ScmException;
400
401    /**
402     * Save the changes you have done into the repository. This will create a new version of the file or
403     * directory in the repository.
404     * <p>
405     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed.
406     * When the fileSet has entries, the commit is non-recursive and only the elements in the fileSet
407     * are committed.
408     *
409     * @param repository the source control system
410     * @param fileSet    the files to check in (sometimes called commit)
411     * @param revision   branch/tag/revision
412     * @param message    a string that is a comment on the changes that where done
413     * @return TODO
414     * @throws ScmException if any
415     */
416    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, ScmVersion revision, String message )
417        throws ScmException;
418
419    /**
420     * Create a copy of the repository on your local machine
421     *
422     * @param repository the source control system
423     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
424     * @param tag        get the version defined by the tag
425     * @return TODO
426     * @throws ScmException if any
427     * @deprecated you must use {@link ScmProvider#checkOut(org.apache.maven.scm.repository.ScmRepository,
428     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)}
429     */
430    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, String tag )
431        throws ScmException;
432
433    /**
434     * Create a copy of the repository on your local machine
435     *
436     * @param repository the source control system
437     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
438     * @return TODO
439     * @throws ScmException if any
440     */
441    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet )
442        throws ScmException;
443
444    /**
445     * Create a copy of the repository on your local machine
446     *
447     * @param repository the source control system
448     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
449     * @param version    get the version defined by the revision, branch or tag
450     * @return TODO
451     * @throws ScmException if any
452     */
453    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
454        throws ScmException;
455
456    /**
457     * Create a copy of the repository on your local machine.
458     *
459     * @param scmRepository the source control system
460     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
461     * @param tag           tag or revision
462     * @param recursive     whether to check out recursively
463     * @return TODO
464     * @throws ScmException if any
465     * @deprecated you must use {@link ScmProvider#checkOut(org.apache.maven.scm.repository.ScmRepository,
466     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, boolean)}
467     */
468    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, String tag, boolean recursive )
469        throws ScmException;
470
471    /**
472     * Create a copy of the repository on your local machine.
473     *
474     * @param scmRepository the source control system
475     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
476     * @param recursive     whether to check out recursively
477     * @return TODO
478     * @throws ScmException if any
479     */
480    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean recursive )
481        throws ScmException;
482
483    /**
484     * Create a copy of the repository on your local machine.
485     *
486     * @param scmRepository the source control system
487     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
488     * @param version       get the version defined by the revision, branch or tag
489     * @param recursive     whether to check out recursively
490     * @return TODO
491     * @throws ScmException if any
492     */
493    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion version,
494                                boolean recursive )
495        throws ScmException;
496
497    /**
498     * Create a copy of the repository on your local machine.
499     *
500     * @param scmRepository     the source control system
501     * @param scmFileSet        the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()}
502     *                          location
503     * @param version           get the version defined by the revision, branch or tag
504     * @param commandParameters parameters
505     * @return TODO
506     * @throws ScmException if any
507     * @since 1.9.6
508     */
509    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion version , //
510                                CommandParameters commandParameters )
511        throws ScmException;
512
513    /**
514     * Create a diff between two branch/tag/revision.
515     *
516     * @param scmRepository the source control system
517     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
518     * @param startRevision the start revision
519     * @param endRevision   the end revision
520     * @return TODO
521     * @throws ScmException if any
522     * @deprecated you must use {@link ScmProvider#diff(org.apache.maven.scm.repository.ScmRepository,
523     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, org.apache.maven.scm.ScmVersion)}
524     */
525    DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, String startRevision, String endRevision )
526        throws ScmException;
527
528    /**
529     * Create a diff between two branch/tag/revision.
530     *
531     * @param scmRepository the source control system
532     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
533     * @param startVersion  the start branch/tag/revision
534     * @param endVersion    the end branch/tag/revision
535     * @return TODO
536     * @throws ScmException if any
537     */
538    DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion startVersion,
539                        ScmVersion endVersion )
540        throws ScmException;
541
542    /**
543     * Create an exported copy of the repository on your local machine
544     *
545     * @param repository the source control system
546     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
547     * @param tag        get the version defined by the tag
548     * @return TODO
549     * @throws ScmException if any
550     * @deprecated you must use {@link ScmProvider#export(org.apache.maven.scm.repository.ScmRepository,
551     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)}
552     */
553    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, String tag )
554        throws ScmException;
555
556    /**
557     * Create an exported copy of the repository on your local machine
558     *
559     * @param repository the source control system
560     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
561     * @return TODO
562     * @throws ScmException if any
563     */
564    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet )
565        throws ScmException;
566
567    /**
568     * Create an exported copy of the repository on your local machine
569     *
570     * @param repository the source control system
571     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
572     * @param version    get the version defined by the branch/tag/revision
573     * @return TODO
574     * @throws ScmException if any
575     */
576    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
577        throws ScmException;
578
579    /**
580     * Create an exported copy of the repository on your local machine
581     *
582     * @param repository      the source control system
583     * @param fileSet         the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
584     * @param tag             get the version defined by the tag
585     * @param outputDirectory the directory where the export will be stored
586     * @return TODO
587     * @throws ScmException if any
588     * @deprecated you must use {@link ScmProvider#export(org.apache.maven.scm.repository.ScmRepository,
589     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, String)}
590     */
591    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, String tag, String outputDirectory )
592        throws ScmException;
593
594    /**
595     * Create an exported copy of the repository on your local machine
596     *
597     * @param repository      the source control system
598     * @param fileSet         the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
599     * @param version         get the version defined by the branch/tag/revision
600     * @param outputDirectory the directory where the export will be stored
601     * @return TODO
602     * @throws ScmException if any
603     */
604    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, String outputDirectory )
605        throws ScmException;
606
607    /**
608     * Removes the given files from the source control system
609     *
610     * @param repository the source control system
611     * @param fileSet    the files to be removed
612     * @param message TODO
613     * @return TODO
614     * @throws ScmException if any
615     */
616    RemoveScmResult remove( ScmRepository repository, ScmFileSet fileSet, String message )
617        throws ScmException;
618
619    /**
620     * Returns the status of the files in the source control system. The state of each file can be one
621     * of the {@link org.apache.maven.scm.ScmFileStatus} flags.
622     *
623     * @param repository the source control system
624     * @param fileSet    the files to know the status about. Implementations can also give the changes
625     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
626     * @return TODO
627     * @throws ScmException if any
628     */
629    StatusScmResult status( ScmRepository repository, ScmFileSet fileSet )
630        throws ScmException;
631
632    /**
633     * Tag (or label in some systems) will tag the source file with a certain tag
634     *
635     * @param repository the source control system
636     * @param fileSet    the files to tag. Implementations can also give the changes
637     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
638     * @param tagName    the tag name to apply to the files
639     * @return TODO
640     * @throws ScmException if any
641     * @deprecated use {@link #tag(ScmRepository, ScmFileSet, String, ScmTagParameters)}
642     */
643    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName )
644        throws ScmException;
645
646    /**
647     * Deletes a tag.
648     *
649     * @param repository the source control system
650     * @param fileSet    a fileset with the relevant working directory as basedir
651     * @param parameters TODO
652     * @return TODO
653     * @throws ScmException if any
654     */
655    UntagScmResult untag( ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters )
656        throws ScmException;
657
658    /**
659     * Tag (or label in some systems) will tag the source file with a certain tag
660     *
661     * @param repository the source control system
662     * @param fileSet    the files to tag. Implementations can also give the changes
663     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
664     * @param tagName    the tag name to apply to the files
665     * @param message    the commit message used for the tag creation
666     * @return TODO
667     * @throws ScmException if any
668     * @deprecated use {@link #tag(ScmRepository, ScmFileSet, String, ScmTagParameters)}
669     */
670    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, String message )
671        throws ScmException;
672
673    /**
674     * Tag (or label in some systems) will tag the source file with a certain tag
675     *
676     * @param repository       the source control system
677     * @param fileSet          the files to tag. Implementations can also give the changes
678     *                         from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
679     * @param tagName          the tag name to apply to the files
680     * @param scmTagParameters bean to pass some paramters for tagging {@link ScmTagParameters}
681     * @return TODO
682     * @throws ScmException if any
683     * @since 1.2
684     */
685    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, ScmTagParameters scmTagParameters )
686        throws ScmException;
687
688    /**
689     * Updates the copy on the local machine with the changes in the repository
690     *
691     * @param repository the source control system
692     * @param fileSet    location of your local copy
693     * @return TODO
694     * @throws ScmException if any
695     */
696    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet )
697        throws ScmException;
698
699    /**
700     * Updates the copy on the local machine with the changes in the repository
701     *
702     * @param repository the source control system
703     * @param fileSet    location of your local copy
704     * @param tag        use the version defined by the tag
705     * @return TODO
706     * @throws ScmException if any
707     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
708     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)}
709     */
710    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag )
711        throws ScmException;
712
713    /**
714     * Updates the copy on the local machine with the changes in the repository
715     *
716     * @param repository the source control system
717     * @param fileSet    location of your local copy
718     * @param version    use the version defined by the branch/tag/revision
719     * @return TODO
720     * @throws ScmException if any
721     */
722    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
723        throws ScmException;
724
725    /**
726     * Updates the copy on the local machine with the changes in the repository
727     *
728     * @param repository   the source control system
729     * @param fileSet      location of your local copy
730     * @param tag          use the version defined by the tag
731     * @param runChangelog Run the changelog command after the update
732     * @return TODO
733     * @throws ScmException if any
734     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
735     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, boolean)}
736     */
737    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, boolean runChangelog )
738        throws ScmException;
739
740    /**
741     * Updates the copy on the local machine with the changes in the repository
742     *
743     * @param repository   the source control system
744     * @param fileSet      location of your local copy
745     * @param runChangelog Run the changelog command after the update
746     * @return TODO
747     * @throws ScmException if any
748     */
749    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, boolean runChangelog )
750        throws ScmException;
751
752    /**
753     * Updates the copy on the local machine with the changes in the repository
754     *
755     * @param repository   the source control system
756     * @param fileSet      location of your local copy
757     * @param version      use the version defined by the branch/tag/revision
758     * @param runChangelog Run the changelog command after the update
759     * @return TODO
760     * @throws ScmException if any
761     */
762    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, boolean runChangelog )
763        throws ScmException;
764
765    /**
766     * Updates the copy on the local machine with the changes in the repository
767     *
768     * @param repository  the source control system
769     * @param fileSet     location of your local copy
770     * @param tag         use the version defined by the tag
771     * @param datePattern the date pattern use in changelog output returned by scm tool
772     * @return TODO
773     * @throws ScmException if any
774     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
775     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, String)}
776     */
777    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, String datePattern )
778        throws ScmException;
779
780    /**
781     * Updates the copy on the local machine with the changes in the repository
782     *
783     * @param repository  the source control system
784     * @param fileSet     location of your local copy
785     * @param version     use the version defined by the branch/tag/revision
786     * @param datePattern the date pattern use in changelog output returned by scm tool
787     * @return TODO
788     * @throws ScmException if any
789     */
790    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, String datePattern )
791        throws ScmException;
792
793    /**
794     * Updates the copy on the local machine with the changes in the repository
795     *
796     * @param repository the source control system
797     * @param fileSet    location of your local copy
798     * @param tag        use the version defined by the tag
799     * @param lastUpdate TODO
800     * @return TODO
801     * @throws ScmException if any
802     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
803     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.util.Date)}
804     */
805    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, Date lastUpdate )
806        throws ScmException;
807
808    /**
809     * Updates the copy on the local machine with the changes in the repository
810     *
811     * @param repository the source control system
812     * @param fileSet    location of your local copy
813     * @param version    use the version defined by the branch/tag/revision
814     * @param lastUpdate TODO
815     * @return TODO
816     * @throws ScmException if any
817     */
818    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate )
819        throws ScmException;
820
821    /**
822     * Updates the copy on the local machine with the changes in the repository
823     *
824     * @param repository  the source control system
825     * @param fileSet     location of your local copy
826     * @param tag         use the version defined by the tag
827     * @param lastUpdate  Date of last update
828     * @param datePattern the date pattern use in changelog output returned by scm tool
829     * @return TODO
830     * @throws ScmException if any
831     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
832     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.util.Date, String)}
833     */
834    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, Date lastUpdate,
835                            String datePattern )
836        throws ScmException;
837
838    /**
839     * Updates the copy on the local machine with the changes in the repository
840     *
841     * @param repository  the source control system
842     * @param fileSet     location of your local copy
843     * @param version     use the version defined by the branch/tag/revision
844     * @param lastUpdate  Date of last update
845     * @param datePattern the date pattern use in changelog output returned by scm tool
846     * @return TODO
847     * @throws ScmException if any
848     */
849    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate,
850                            String datePattern )
851        throws ScmException;
852
853    /**
854     * Make a file editable. This is used in source control systems where you look at read-only files
855     * and you need to make them not read-only anymore before you can edit them. This can also mean
856     * that no other user in the system can make the file not read-only anymore.
857     *
858     * @param repository the source control system
859     * @param fileSet    the files to make editable
860     * @return TODO
861     * @throws ScmException if any
862     */
863    EditScmResult edit( ScmRepository repository, ScmFileSet fileSet )
864        throws ScmException;
865
866    /**
867     * Make a file no longer editable. This is the conterpart of {@link #edit(
868     *org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)}.
869     * It makes the file read-only again.
870     *
871     * @param repository the source control system
872     * @param fileSet    the files to make uneditable
873     * @return TODO
874     * @throws ScmException if any
875     */
876    UnEditScmResult unedit( ScmRepository repository, ScmFileSet fileSet )
877        throws ScmException;
878
879    /**
880     * List each element (files and directories) of <B>fileSet</B> as they exist in the repository.
881     *
882     * @param repository the source control system
883     * @param fileSet    the files to list
884     * @param recursive  descend recursively
885     * @param tag        use the version defined by the tag
886     * @return the list of files in the repository
887     * @throws ScmException if any
888     * @deprecated you must use {@link ScmProvider#list(org.apache.maven.scm.repository.ScmRepository,
889     *             org.apache.maven.scm.ScmFileSet, boolean, org.apache.maven.scm.ScmVersion)}
890     */
891    ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, String tag )
892        throws ScmException;
893
894    /**
895     * List each element (files and directories) of <B>fileSet</B> as they exist in the repository.
896     *
897     * @param repository the source control system
898     * @param fileSet    the files to list
899     * @param recursive  descend recursively
900     * @param version    use the version defined by the branch/tag/revision
901     * @return the list of files in the repository
902     * @throws ScmException if any
903     */
904    ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion version )
905        throws ScmException;
906
907    /**
908     * Returns the blame of specified file
909     *
910     * @param repository the source control system
911     * @param fileSet    location of your local copy
912     * @param filename   file
913     * @return blame for specified file
914     * @throws ScmException if any
915     * @since 1.4
916     * @deprecated use blame with {@link BlameScmRequest} parameter
917     */
918    BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
919        throws ScmException;
920
921    /**
922     *
923     * @param blameScmRequest TODO
924     * @return blame for the file specified in the request
925     * @throws ScmException if any
926     * @since 1.8
927     */
928    BlameScmResult blame( BlameScmRequest blameScmRequest )
929        throws ScmException;
930
931
932    /**
933     * Create directory/directories in the repository.
934     *
935     * @param repository TODO
936     * @param fileSet TODO
937     * @param createInLocal TODO
938     * @param message TODO
939     * @return TODO
940     * @throws ScmException if any
941     */
942    MkdirScmResult mkdir( ScmRepository repository, ScmFileSet fileSet, String message, boolean createInLocal )
943        throws ScmException;
944
945    /**
946     * @param repository the source control system
947     * @param fileSet    location of your local copy
948     * @param parameters some parameters (not use currently but for future use)
949     * @return if the scm implementation doesn't support "info" result will <code>null</code>
950     * @throws ScmException if any
951     * @since 1.5
952     */
953    InfoScmResult info( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
954        throws ScmException;
955
956    /**
957     * @param repository the source control system
958     * @param fileSet    not use currently but for future use
959     * @param parameters some parameters (not use currently but for future use)
960     * @return if the scm implementation doesn't support "info" result will <code>null</code>
961     * @throws ScmException if any
962     * @since 1.6
963     */
964    RemoteInfoScmResult remoteInfo( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
965        throws ScmException;
966}