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