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
159     * @throws ScmException if any
160     * @deprecated use {@link #branch(ScmRepository, ScmFileSet, String, 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
174     * @throws ScmException if any
175     * @deprecated use {@link #branch(ScmRepository, ScmFileSet, String, 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     * @return
189     * @throws ScmException if any
190     * @since 1.3
191     */
192    BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName,
193                            ScmBranchParameters scmBranchParameters )
194        throws ScmException;
195
196    /**
197     * Returns the changes that have happend in the source control system in a certain period of time.
198     * This can be adding, removing, updating, ... of files
199     *
200     * @param repository the source control system
201     * @param fileSet    the files to know the changes about. Implementations can also give the changes
202     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
203     * @param startDate  the start date of the period
204     * @param endDate    the end date of the period
205     * @param numDays    the number days before the current time if startdate and enddate are null
206     * @param branch     the branch/tag name
207     * @return The SCM result of the changelog command
208     * @throws ScmException if any
209     * @deprecated you must use {@link ScmProvider#changeLog(org.apache.maven.scm.repository.ScmRepository,
210     *             org.apache.maven.scm.ScmFileSet, java.util.Date, java.util.Date, int,
211     *             org.apache.maven.scm.ScmBranch)}
212     */
213    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
214                                  int numDays, String branch )
215        throws ScmException;
216
217    /**
218     * Returns the changes that have happend in the source control system in a certain period of time.
219     * This can be adding, removing, updating, ... of files
220     *
221     * @param repository the source control system
222     * @param fileSet    the files to know the changes about. Implementations can also give the changes
223     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
224     * @param startDate  the start date of the period
225     * @param endDate    the end date of the period
226     * @param numDays    the number days before the current time if startdate and enddate are null
227     * @param branch     the branch/tag
228     * @return The SCM result of the changelog command
229     * @throws ScmException if any
230     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
231     */
232    @Deprecated
233    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
234                                  int numDays, ScmBranch branch )
235        throws ScmException;
236
237    /**
238     * Returns the changes that have happend in the source control system in a certain period of time.
239     * This can be adding, removing, updating, ... of files
240     *
241     * @param repository  the source control system
242     * @param fileSet     the files to know the changes about. Implementations can also give the changes
243     *                    from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
244     * @param startDate   the start date of the period
245     * @param endDate     the end date of the period
246     * @param numDays     the number days before the current time if startdate and enddate are null
247     * @param branch      the branch/tag name
248     * @param datePattern the date pattern use in changelog output returned by scm tool
249     * @return The SCM result of the changelog command
250     * @throws ScmException if any
251     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
252     */
253    @Deprecated
254    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
255                                  int numDays, String branch, String datePattern )
256        throws ScmException;
257
258    /**
259     * Returns the changes that have happend in the source control system in a certain period of time.
260     * This can be adding, removing, updating, ... of files
261     *
262     * @param repository  the source control system
263     * @param fileSet     the files to know the changes about. Implementations can also give the changes
264     *                    from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
265     * @param startDate   the start date of the period
266     * @param endDate     the end date of the period
267     * @param numDays     the number days before the current time if startdate and enddate are null
268     * @param branch      the branch/tag
269     * @param datePattern the date pattern use in changelog output returned by scm tool
270     * @return The SCM result of the changelog command
271     * @throws ScmException if any
272     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
273     */
274    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
275                                  int numDays, ScmBranch branch, String datePattern )
276        throws ScmException;
277
278    /**
279     * Returns the changes that have happend in the source control system in a certain period of time.
280     * This can be adding, removing, updating, ... of files
281     *
282     * @param scmRequest request wrapping detailed parameters for the changelog command
283     * @return The SCM result of the changelog command
284     * @throws ScmException if any
285     * @since 1.8
286     */
287    ChangeLogScmResult changeLog( ChangeLogScmRequest scmRequest )
288        throws ScmException;
289
290    /**
291     * Returns the changes that have happend in the source control system between two tags.
292     * This can be adding, removing, updating, ... of files
293     *
294     * @param repository the source control system
295     * @param fileSet    the files to know the changes about. Implementations can also give the changes
296     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
297     * @param startTag   the start tag
298     * @param endTag     the end tag
299     * @return The SCM result of the changelog command
300     * @throws ScmException if any
301     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
302     */
303    @Deprecated
304    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, String startTag, String endTag )
305        throws ScmException;
306
307    /**
308     * Returns the changes that have happend in the source control system between two tags.
309     * This can be adding, removing, updating, ... of files
310     *
311     * @param repository   the source control system
312     * @param fileSet      the files to know the changes about. Implementations can also give the changes
313     *                     from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
314     * @param startVersion the start branch/tag/revision
315     * @param endVersion   the end branch/tag/revision
316     * @return The SCM result of the changelog command
317     * @throws ScmException if any
318     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
319     */
320    @Deprecated
321    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startVersion,
322                                  ScmVersion endVersion )
323        throws ScmException;
324
325    /**
326     * Returns the changes that have happend in the source control system between two tags.
327     * This can be adding, removing, updating, ... of files
328     *
329     * @param repository  the source control system
330     * @param fileSet     the files to know the changes about. Implementations can also give the changes
331     *                    from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
332     * @param startTag    the start tag
333     * @param endTag      the end tag
334     * @param datePattern the date pattern use in changelog output returned by scm tool
335     * @return
336     * @throws ScmException if any
337     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
338     */
339    @Deprecated
340    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, String startTag, String endTag,
341                                  String datePattern )
342        throws ScmException;
343
344    /**
345     * Returns the changes that have happend in the source control system between two tags.
346     * This can be adding, removing, updating, ... of files
347     *
348     * @param repository    the source control system
349     * @param fileSet       the files to know the changes about. Implementations can also give the changes
350     *                      from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
351     * @param startRevision the start revision
352     * @param endRevision   the end revision
353     * @param datePattern   the date pattern use in changelog output returned by scm tool
354     * @return
355     * @throws ScmException if any
356     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
357     */
358    @Deprecated
359    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startRevision,
360                                  ScmVersion endRevision, String datePattern )
361        throws ScmException;
362
363    /**
364     * Save the changes you have done into the repository. This will create a new version of the file or
365     * directory in the repository.
366     * <p/>
367     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed.
368     * When the fileSet has entries, the commit is non-recursive and only the elements in the fileSet
369     * are committed.
370     *
371     * @param repository the source control system
372     * @param fileSet    the files to check in (sometimes called commit)
373     * @param tag        tag or revision
374     * @param message    a string that is a comment on the changes that where done
375     * @return
376     * @throws ScmException if any
377     * @deprecated you must use {@link ScmProvider#checkIn(org.apache.maven.scm.repository.ScmRepository,
378     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, String)}
379     */
380    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, String tag, String message )
381        throws ScmException;
382
383    /**
384     * Save the changes you have done into the repository. This will create a new version of the file or
385     * directory in the repository.
386     * <p/>
387     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed.
388     * When the fileSet has entries, the commit is non-recursive and only the elements in the fileSet
389     * are committed.
390     *
391     * @param repository the source control system
392     * @param fileSet    the files to check in (sometimes called commit)
393     * @param message    a string that is a comment on the changes that where done
394     * @return
395     * @throws ScmException if any
396     */
397    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, String message )
398        throws ScmException;
399
400    /**
401     * Save the changes you have done into the repository. This will create a new version of the file or
402     * directory in the repository.
403     * <p/>
404     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed.
405     * When the fileSet has entries, the commit is non-recursive and only the elements in the fileSet
406     * are committed.
407     *
408     * @param repository the source control system
409     * @param fileSet    the files to check in (sometimes called commit)
410     * @param revision   branch/tag/revision
411     * @param message    a string that is a comment on the changes that where done
412     * @return
413     * @throws ScmException if any
414     */
415    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, ScmVersion revision, String message )
416        throws ScmException;
417
418    /**
419     * Create a copy of the repository on your local machine
420     *
421     * @param repository the source control system
422     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
423     * @param tag        get the version defined by the tag
424     * @return
425     * @throws ScmException if any
426     * @deprecated you must use {@link ScmProvider#checkOut(org.apache.maven.scm.repository.ScmRepository,
427     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)}
428     */
429    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, String tag )
430        throws ScmException;
431
432    /**
433     * Create a copy of the repository on your local machine
434     *
435     * @param repository the source control system
436     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
437     * @return
438     * @throws ScmException if any
439     */
440    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet )
441        throws ScmException;
442
443    /**
444     * Create a copy of the repository on your local machine
445     *
446     * @param repository the source control system
447     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
448     * @param version    get the version defined by the revision, branch or tag
449     * @return
450     * @throws ScmException if any
451     */
452    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
453        throws ScmException;
454
455    /**
456     * Create a copy of the repository on your local machine.
457     *
458     * @param scmRepository the source control system
459     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
460     * @param tag           tag or revision
461     * @param recursive     whether to check out recursively
462     * @return
463     * @throws ScmException if any
464     * @deprecated you must use {@link ScmProvider#checkOut(org.apache.maven.scm.repository.ScmRepository,
465     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, boolean)}
466     */
467    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, String tag, boolean recursive )
468        throws ScmException;
469
470    /**
471     * Create a copy of the repository on your local machine.
472     *
473     * @param scmRepository the source control system
474     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
475     * @param recursive     whether to check out recursively
476     * @return
477     * @throws ScmException if any
478     */
479    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean recursive )
480        throws ScmException;
481
482    /**
483     * Create a copy of the repository on your local machine.
484     *
485     * @param scmRepository the source control system
486     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
487     * @param version       get the version defined by the revision, branch or tag
488     * @param recursive     whether to check out recursively
489     * @return
490     * @throws ScmException if any
491     */
492    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion version,
493                                boolean recursive )
494        throws ScmException;
495
496    /**
497     * Create a copy of the repository on your local machine.
498     *
499     * @param scmRepository     the source control system
500     * @param scmFileSet        the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()}
501     *                          location
502     * @param version           get the version defined by the revision, branch or tag
503     * @param commandParameters parameters
504     * @return
505     * @throws ScmException if any
506     * @since 1.9.6
507     */
508    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion version , //
509                                CommandParameters commandParameters )
510        throws ScmException;
511
512    /**
513     * Create a diff between two branch/tag/revision.
514     *
515     * @param scmRepository the source control system
516     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
517     * @param startRevision the start revision
518     * @param endRevision   the end revision
519     * @return
520     * @throws ScmException if any
521     * @deprecated you must use {@link ScmProvider#diff(org.apache.maven.scm.repository.ScmRepository,
522     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, org.apache.maven.scm.ScmVersion)}
523     */
524    DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, String startRevision, String endRevision )
525        throws ScmException;
526
527    /**
528     * Create a diff between two branch/tag/revision.
529     *
530     * @param scmRepository the source control system
531     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
532     * @param startVersion  the start branch/tag/revision
533     * @param endVersion    the end branch/tag/revision
534     * @return
535     * @throws ScmException if any
536     */
537    DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion startVersion,
538                        ScmVersion endVersion )
539        throws ScmException;
540
541    /**
542     * Create an exported copy of the repository on your local machine
543     *
544     * @param repository the source control system
545     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
546     * @param tag        get the version defined by the tag
547     * @return
548     * @throws ScmException if any
549     * @deprecated you must use {@link ScmProvider#export(org.apache.maven.scm.repository.ScmRepository,
550     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)}
551     */
552    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, String tag )
553        throws ScmException;
554
555    /**
556     * Create an exported copy of the repository on your local machine
557     *
558     * @param repository the source control system
559     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
560     * @return
561     * @throws ScmException if any
562     */
563    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet )
564        throws ScmException;
565
566    /**
567     * Create an exported copy of the repository on your local machine
568     *
569     * @param repository the source control system
570     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
571     * @param version    get the version defined by the branch/tag/revision
572     * @return
573     * @throws ScmException if any
574     */
575    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
576        throws ScmException;
577
578    /**
579     * Create an exported copy of the repository on your local machine
580     *
581     * @param repository      the source control system
582     * @param fileSet         the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
583     * @param tag             get the version defined by the tag
584     * @param outputDirectory the directory where the export will be stored
585     * @return
586     * @throws ScmException if any
587     * @deprecated you must use {@link ScmProvider#export(org.apache.maven.scm.repository.ScmRepository,
588     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, String)}
589     */
590    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, String tag, String outputDirectory )
591        throws ScmException;
592
593    /**
594     * Create an exported copy of the repository on your local machine
595     *
596     * @param repository      the source control system
597     * @param fileSet         the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
598     * @param version         get the version defined by the branch/tag/revision
599     * @param outputDirectory the directory where the export will be stored
600     * @return
601     * @throws ScmException if any
602     */
603    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, String outputDirectory )
604        throws ScmException;
605
606    /**
607     * Removes the given files from the source control system
608     *
609     * @param repository the source control system
610     * @param fileSet    the files to be removed
611     * @param message
612     * @return
613     * @throws ScmException if any
614     */
615    RemoveScmResult remove( ScmRepository repository, ScmFileSet fileSet, String message )
616        throws ScmException;
617
618    /**
619     * Returns the status of the files in the source control system. The state of each file can be one
620     * of the {@link org.apache.maven.scm.ScmFileStatus} flags.
621     *
622     * @param repository the source control system
623     * @param fileSet    the files to know the status about. Implementations can also give the changes
624     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
625     * @return
626     * @throws ScmException if any
627     */
628    StatusScmResult status( ScmRepository repository, ScmFileSet fileSet )
629        throws ScmException;
630
631    /**
632     * Tag (or label in some systems) will tag the source file with a certain tag
633     *
634     * @param repository the source control system
635     * @param fileSet    the files to tag. Implementations can also give the changes
636     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
637     * @param tagName    the tag name to apply to the files
638     * @return
639     * @throws ScmException if any
640     * @deprecated use {@link #tag(ScmRepository, ScmFileSet, String, ScmTagParameters)}
641     */
642    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName )
643        throws ScmException;
644
645    /**
646     * Deletes a tag.
647     *
648     * @param repository the source control system
649     * @param fileSet    a fileset with the relevant working directory as basedir
650     * @param parameters
651     * @return
652     * @throws ScmException if any
653     */
654    UntagScmResult untag( ScmRepository repository, ScmFileSet fileSet, CommandParameters parameters )
655        throws ScmException;
656
657    /**
658     * Tag (or label in some systems) will tag the source file with a certain tag
659     *
660     * @param repository the source control system
661     * @param fileSet    the files to tag. Implementations can also give the changes
662     *                   from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
663     * @param tagName    the tag name to apply to the files
664     * @param message    the commit message used for the tag creation
665     * @return
666     * @throws ScmException if any
667     * @deprecated use {@link #tag(ScmRepository, ScmFileSet, String, ScmTagParameters)}
668     */
669    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, String message )
670        throws ScmException;
671
672    /**
673     * Tag (or label in some systems) will tag the source file with a certain tag
674     *
675     * @param repository       the source control system
676     * @param fileSet          the files to tag. Implementations can also give the changes
677     *                         from the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
678     * @param tagName          the tag name to apply to the files
679     * @param scmTagParameters bean to pass some paramters for tagging {@link ScmTagParameters}
680     * @return
681     * @throws ScmException if any
682     * @since 1.2
683     */
684    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, ScmTagParameters scmTagParameters )
685        throws ScmException;
686
687    /**
688     * Updates the copy on the local machine with the changes in the repository
689     *
690     * @param repository the source control system
691     * @param fileSet    location of your local copy
692     * @return
693     * @throws ScmException if any
694     */
695    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet )
696        throws ScmException;
697
698    /**
699     * Updates the copy on the local machine with the changes in the repository
700     *
701     * @param repository the source control system
702     * @param fileSet    location of your local copy
703     * @param tag        use the version defined by the tag
704     * @return
705     * @throws ScmException if any
706     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
707     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion)}
708     */
709    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag )
710        throws ScmException;
711
712    /**
713     * Updates the copy on the local machine with the changes in the repository
714     *
715     * @param repository the source control system
716     * @param fileSet    location of your local copy
717     * @param version    use the version defined by the branch/tag/revision
718     * @return
719     * @throws ScmException if any
720     */
721    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
722        throws ScmException;
723
724    /**
725     * Updates the copy on the local machine with the changes in the repository
726     *
727     * @param repository   the source control system
728     * @param fileSet      location of your local copy
729     * @param tag          use the version defined by the tag
730     * @param runChangelog Run the changelog command after the update
731     * @return
732     * @throws ScmException if any
733     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
734     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, boolean)}
735     */
736    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, boolean runChangelog )
737        throws ScmException;
738
739    /**
740     * Updates the copy on the local machine with the changes in the repository
741     *
742     * @param repository   the source control system
743     * @param fileSet      location of your local copy
744     * @param runChangelog Run the changelog command after the update
745     * @return
746     * @throws ScmException if any
747     */
748    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, boolean runChangelog )
749        throws ScmException;
750
751    /**
752     * Updates the copy on the local machine with the changes in the repository
753     *
754     * @param repository   the source control system
755     * @param fileSet      location of your local copy
756     * @param version      use the version defined by the branch/tag/revision
757     * @param runChangelog Run the changelog command after the update
758     * @return
759     * @throws ScmException if any
760     */
761    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, boolean runChangelog )
762        throws ScmException;
763
764    /**
765     * Updates the copy on the local machine with the changes in the repository
766     *
767     * @param repository  the source control system
768     * @param fileSet     location of your local copy
769     * @param tag         use the version defined by the tag
770     * @param datePattern the date pattern use in changelog output returned by scm tool
771     * @return
772     * @throws ScmException if any
773     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
774     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, String)}
775     */
776    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, String datePattern )
777        throws ScmException;
778
779    /**
780     * Updates the copy on the local machine with the changes in the repository
781     *
782     * @param repository  the source control system
783     * @param fileSet     location of your local copy
784     * @param version     use the version defined by the branch/tag/revision
785     * @param datePattern the date pattern use in changelog output returned by scm tool
786     * @return
787     * @throws ScmException if any
788     */
789    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, String datePattern )
790        throws ScmException;
791
792    /**
793     * Updates the copy on the local machine with the changes in the repository
794     *
795     * @param repository the source control system
796     * @param fileSet    location of your local copy
797     * @param tag        use the version defined by the tag
798     * @param lastUpdate
799     * @return
800     * @throws ScmException if any
801     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
802     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.util.Date)}
803     */
804    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, Date lastUpdate )
805        throws ScmException;
806
807    /**
808     * Updates the copy on the local machine with the changes in the repository
809     *
810     * @param repository the source control system
811     * @param fileSet    location of your local copy
812     * @param version    use the version defined by the branch/tag/revision
813     * @param lastUpdate
814     * @return
815     * @throws ScmException if any
816     */
817    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate )
818        throws ScmException;
819
820    /**
821     * Updates the copy on the local machine with the changes in the repository
822     *
823     * @param repository  the source control system
824     * @param fileSet     location of your local copy
825     * @param tag         use the version defined by the tag
826     * @param lastUpdate  Date of last update
827     * @param datePattern the date pattern use in changelog output returned by scm tool
828     * @return
829     * @throws ScmException if any
830     * @deprecated you must use {@link ScmProvider#update(org.apache.maven.scm.repository.ScmRepository,
831     *             org.apache.maven.scm.ScmFileSet, org.apache.maven.scm.ScmVersion, java.util.Date, String)}
832     */
833    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String tag, Date lastUpdate,
834                            String datePattern )
835        throws ScmException;
836
837    /**
838     * Updates the copy on the local machine with the changes in the repository
839     *
840     * @param repository  the source control system
841     * @param fileSet     location of your local copy
842     * @param version     use the version defined by the branch/tag/revision
843     * @param lastUpdate  Date of last update
844     * @param datePattern the date pattern use in changelog output returned by scm tool
845     * @return
846     * @throws ScmException if any
847     */
848    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate,
849                            String datePattern )
850        throws ScmException;
851
852    /**
853     * Make a file editable. This is used in source control systems where you look at read-only files
854     * and you need to make them not read-only anymore before you can edit them. This can also mean
855     * that no other user in the system can make the file not read-only anymore.
856     *
857     * @param repository the source control system
858     * @param fileSet    the files to make editable
859     * @return
860     * @throws ScmException if any
861     */
862    EditScmResult edit( ScmRepository repository, ScmFileSet fileSet )
863        throws ScmException;
864
865    /**
866     * Make a file no longer editable. This is the conterpart of {@link #edit(
867     *org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)}.
868     * It makes the file read-only again.
869     *
870     * @param repository the source control system
871     * @param fileSet    the files to make uneditable
872     * @return
873     * @throws ScmException if any
874     */
875    UnEditScmResult unedit( ScmRepository repository, ScmFileSet fileSet )
876        throws ScmException;
877
878    /**
879     * List each element (files and directories) of <B>fileSet</B> as they exist in the repository.
880     *
881     * @param repository the source control system
882     * @param fileSet    the files to list
883     * @param recursive  descend recursively
884     * @param tag        use the version defined by the tag
885     * @return the list of files in the repository
886     * @deprecated you must use {@link ScmProvider#list(org.apache.maven.scm.repository.ScmRepository,
887     *             org.apache.maven.scm.ScmFileSet, boolean, org.apache.maven.scm.ScmVersion)}
888     */
889    ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, String tag )
890        throws ScmException;
891
892    /**
893     * List each element (files and directories) of <B>fileSet</B> as they exist in the repository.
894     *
895     * @param repository the source control system
896     * @param fileSet    the files to list
897     * @param recursive  descend recursively
898     * @param version    use the version defined by the branch/tag/revision
899     * @return the list of files in the repository
900     * @throws ScmException if any
901     */
902    ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion version )
903        throws ScmException;
904
905    /**
906     * Returns the blame of specified file
907     *
908     * @param repository the source control system
909     * @param fileSet    location of your local copy
910     * @param filename   file
911     * @return blame for specified file
912     * @throws ScmException
913     * @since 1.4
914     * @deprecated use blame with {@link BlameScmRequest} parameter
915     */
916    BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
917        throws ScmException;
918
919    /**
920     *
921     * @param blameScmRequest
922     * @return blame for the file specified in the request
923     * @throws ScmException
924     * @since 1.8
925     */
926    BlameScmResult blame( BlameScmRequest blameScmRequest )
927        throws ScmException;
928
929
930    /**
931     * Create directory/directories in the repository.
932     *
933     * @param repository
934     * @param fileSet
935     * @param createInLocal
936     * @param message
937     * @return
938     * @throws ScmException
939     */
940    MkdirScmResult mkdir( ScmRepository repository, ScmFileSet fileSet, String message, boolean createInLocal )
941        throws ScmException;
942
943    /**
944     * @param repository the source control system
945     * @param fileSet    location of your local copy
946     * @param parameters some parameters (not use currently but for future use)
947     * @return if the scm implementation doesn't support "info" result will <code>null</code>
948     * @throws ScmException
949     * @since 1.5
950     */
951    InfoScmResult info( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
952        throws ScmException;
953
954    /**
955     * @param repository the source control system
956     * @param fileSet    not use currently but for future use
957     * @param parameters some parameters (not use currently but for future use)
958     * @return if the scm implementation doesn't support "info" result will <code>null</code>
959     * @throws ScmException
960     * @since 1.6
961     */
962    RemoteInfoScmResult remoteInfo( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
963        throws ScmException;
964}