001package org.apache.maven.scm.manager;
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.ScmBranch;
023import org.apache.maven.scm.ScmException;
024import org.apache.maven.scm.ScmFileSet;
025import org.apache.maven.scm.ScmVersion;
026import org.apache.maven.scm.command.add.AddScmResult;
027import org.apache.maven.scm.command.blame.BlameScmRequest;
028import org.apache.maven.scm.command.blame.BlameScmResult;
029import org.apache.maven.scm.command.branch.BranchScmResult;
030import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
031import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
032import org.apache.maven.scm.command.checkin.CheckInScmResult;
033import org.apache.maven.scm.command.checkout.CheckOutScmResult;
034import org.apache.maven.scm.command.diff.DiffScmResult;
035import org.apache.maven.scm.command.edit.EditScmResult;
036import org.apache.maven.scm.command.export.ExportScmResult;
037import org.apache.maven.scm.command.list.ListScmResult;
038import org.apache.maven.scm.command.mkdir.MkdirScmResult;
039import org.apache.maven.scm.command.remove.RemoveScmResult;
040import org.apache.maven.scm.command.status.StatusScmResult;
041import org.apache.maven.scm.command.tag.TagScmResult;
042import org.apache.maven.scm.command.unedit.UnEditScmResult;
043import org.apache.maven.scm.command.update.UpdateScmResult;
044import org.apache.maven.scm.provider.ScmProvider;
045import org.apache.maven.scm.repository.ScmRepository;
046import org.apache.maven.scm.repository.ScmRepositoryException;
047import org.apache.maven.scm.repository.UnknownRepositoryStructure;
048
049import java.io.File;
050import java.util.Date;
051import java.util.List;
052
053/**
054 * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
055 * @author <a href="mailto:brett@apache.org">Brett Porter</a>
056 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
057 * @author Olivier Lamy
058 *
059 */
060public interface ScmManager
061{
062    String ROLE = ScmManager.class.getName();
063
064    // ----------------------------------------------------------------------
065    // Repository
066    // ----------------------------------------------------------------------
067
068    /**
069     * Generate a SCMRepository from a SCM url.
070     *
071     * @param scmUrl the scm url
072     * @return The scm repository
073     * @throws ScmRepositoryException     if an error occurs in the scm repository construction
074     * @throws NoSuchScmProviderException if the provider doesn't exist
075     */
076    ScmRepository makeScmRepository( String scmUrl )
077        throws ScmRepositoryException, NoSuchScmProviderException;
078
079    ScmRepository makeProviderScmRepository( String providerType, File path )
080        throws ScmRepositoryException, UnknownRepositoryStructure, NoSuchScmProviderException;
081
082    /**
083     * Validate a SCM URL.
084     *
085     * @param scmUrl the SCM URL to validate
086     * @return <code>List</code> of <code>String</code> objects with the messages returned by the SCM provider
087     */
088    List<String> validateScmRepository( String scmUrl );
089
090    ScmProvider getProviderByUrl( String scmUrl )
091        throws ScmRepositoryException, NoSuchScmProviderException;
092
093    /**
094     * Returns the default provider registered for this providerType or a specific implementation if the
095     * 'maven.scm.provider.providerType.implementation' system property is defined. For example:
096     * maven.scm.provider.cvs.implementation=cvs_native
097     *
098     * @param providerType The provider type (cvs, svn...)
099     * @return The scm provider
100     * @throws NoSuchScmProviderException if the provider doesn't exist
101     */
102    ScmProvider getProviderByType( String providerType )
103        throws NoSuchScmProviderException;
104
105    ScmProvider getProviderByRepository( ScmRepository repository )
106        throws NoSuchScmProviderException;
107
108    /**
109     * Set a provider to be used for a type of SCM. If there was already a designed provider for that type it will be
110     * replaced.
111     *
112     * @param providerType the type of SCM, eg. <code>svn</code>, <code>cvs</code>
113     * @param provider     the provider that will be used for that SCM type
114     */
115    void setScmProvider( String providerType, ScmProvider provider );
116
117    /**
118     * Set the provider implementation
119     *
120     * @param providerType           The provider type, eg. <code>cvs</code>
121     * @param providerImplementation The provider implementation (the role-hint of the provider), eg. <code>cvs</code>,
122     *                               <code>cvs_native</code>
123     */
124    void setScmProviderImplementation( String providerType, String providerImplementation );
125
126    /**
127     * Adds the given files to the source control system
128     *
129     * @param repository the source control system
130     * @param fileSet    the files to be added
131     * @return an {@link org.apache.maven.scm.command.add.AddScmResult} that contains the files that have been added
132     * @throws org.apache.maven.scm.ScmException
133     *
134     */
135    AddScmResult add( ScmRepository repository, ScmFileSet fileSet )
136        throws ScmException;
137
138    /**
139     * Adds the given files to the source control system
140     *
141     * @param repository the source control system
142     * @param fileSet    the files to be added
143     * @param message    a string that is a comment on the new added file
144     * @return an {@link AddScmResult} that contains the files that have been added
145     * @throws ScmException if any
146     */
147    AddScmResult add( ScmRepository repository, ScmFileSet fileSet, String message )
148        throws ScmException;
149
150    /**
151     * Branch (or label in some systems) will create a branch of the source file with a certain branch name
152     *
153     * @param repository the source control system
154     * @param fileSet    the files to branch. Implementations can also give the changes from the
155     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
156     * @param branchName the branch name to apply to the files
157     * @return
158     * @throws ScmException if any
159     */
160    BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName )
161        throws ScmException;
162
163    /**
164     * Branch (or label in some systems) will create a branch of the source file with a certain branch name
165     *
166     * @param repository the source control system
167     * @param fileSet    the files to branch. Implementations can also give the changes from the
168     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
169     * @param branchName the branch name to apply to the files
170     * @param message    the commit message used for the tag creation
171     * @return
172     * @throws ScmException if any
173     */
174    BranchScmResult branch( ScmRepository repository, ScmFileSet fileSet, String branchName, String message )
175        throws ScmException;
176
177    /**
178     * Returns the changes that have happend in the source control system in a certain period of time. This can be
179     * adding, removing, updating, ... of files
180     *
181     * @param repository the source control system
182     * @param fileSet    the files to know the changes about. Implementations can also give the changes from the
183     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
184     * @param startDate  the start date of the period
185     * @param endDate    the end date of the period
186     * @param numDays    the number days before the current time if startdate and enddate are null
187     * @param branch     the branch/tag
188     * @return The SCM result of the changelog command
189     * @throws ScmException if any
190     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
191     */
192    @Deprecated
193    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
194                                  int numDays, ScmBranch branch )
195        throws ScmException;
196
197    /**
198     * Returns the changes that have happend in the source control system in a certain period of time. This can be
199     * adding, removing, updating, ... of files
200     *
201     * @param repository  the source control system
202     * @param fileSet     the files to know the changes about. Implementations can also give the changes from the
203     *                    {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
204     * @param startDate   the start date of the period
205     * @param endDate     the end date of the period
206     * @param numDays     the number days before the current time if startdate and enddate are null
207     * @param branch      the branch/tag
208     * @param datePattern the date pattern use in changelog output returned by scm tool
209     * @return The SCM result of the changelog command
210     * @throws ScmException if any
211     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
212     */
213    @Deprecated
214    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, Date startDate, Date endDate,
215                                  int numDays, ScmBranch branch, String datePattern )
216        throws ScmException;
217
218    /**
219     * Returns the changes that have happend in the source control system in a certain period of time. This can be
220     * adding, removing, updating, ... of files
221     *
222     * @param scmRequest request wrapping detailed parameters for the changelog command
223     * @return The SCM result of the changelog command
224     * @throws ScmException if any
225     * @since 1.8
226     */
227    ChangeLogScmResult changeLog( ChangeLogScmRequest scmRequest )
228        throws ScmException;
229
230    /**
231     * Returns the changes that have happend in the source control system between two tags. This can be adding,
232     * removing, updating, ... of files
233     *
234     * @param repository   the source control system
235     * @param fileSet      the files to know the changes about. Implementations can also give the changes from the
236     *                     {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
237     * @param startVersion the start branch/tag/revision
238     * @param endVersion   the end branch/tag/revision
239     * @return The SCM result of the changelog command
240     * @throws ScmException if any
241     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
242     */
243    @Deprecated
244    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startVersion,
245                                  ScmVersion endVersion )
246        throws ScmException;
247
248    /**
249     * Returns the changes that have happend in the source control system between two tags. This can be adding,
250     * removing, updating, ... of files
251     *
252     * @param repository    the source control system
253     * @param fileSet       the files to know the changes about. Implementations can also give the changes from the
254     *                      {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
255     * @param startRevision the start revision
256     * @param endRevision   the end revision
257     * @param datePattern   the date pattern use in changelog output returned by scm tool
258     * @return
259     * @throws ScmException if any
260     * @deprecated use {@link #changeLog(org.apache.maven.scm.command.changelog.ChangeLogScmRequest)} instead
261     */
262    @Deprecated
263    ChangeLogScmResult changeLog( ScmRepository repository, ScmFileSet fileSet, ScmVersion startRevision,
264                                  ScmVersion endRevision, String datePattern )
265        throws ScmException;
266
267    /**
268     * Save the changes you have done into the repository. This will create a new version of the file or directory in
269     * the repository.
270     * <p/>
271     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed. When the fileSet has entries,
272     * the commit is non-recursive and only the elements in the fileSet are committed.
273     *
274     * @param repository the source control system
275     * @param fileSet    the files to check in (sometimes called commit)
276     * @param message    a string that is a comment on the changes that where done
277     * @return
278     * @throws ScmException if any
279     */
280    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, String message )
281        throws ScmException;
282
283    /**
284     * Save the changes you have done into the repository. This will create a new version of the file or directory in
285     * the repository.
286     * <p/>
287     * When the fileSet has no entries, the fileSet.getBaseDir() is recursively committed. When the fileSet has entries,
288     * the commit is non-recursive and only the elements in the fileSet are committed.
289     *
290     * @param repository the source control system
291     * @param fileSet    the files to check in (sometimes called commit)
292     * @param revision   branch/tag/revision
293     * @param message    a string that is a comment on the changes that where done
294     * @return
295     * @throws ScmException if any
296     */
297    CheckInScmResult checkIn( ScmRepository repository, ScmFileSet fileSet, ScmVersion revision, String message )
298        throws ScmException;
299
300    /**
301     * Create a copy of the repository on your local machine
302     *
303     * @param repository the source control system
304     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
305     * @return
306     * @throws ScmException if any
307     */
308    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet )
309        throws ScmException;
310
311    /**
312     * Create a copy of the repository on your local machine
313     *
314     * @param repository the source control system
315     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
316     * @param version    get the version defined by the revision, branch or tag
317     * @return
318     * @throws ScmException if any
319     */
320    CheckOutScmResult checkOut( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
321        throws ScmException;
322
323    /**
324     * Create a copy of the repository on your local machine.
325     *
326     * @param scmRepository the source control system
327     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
328     * @param recursive     whether to check out recursively
329     * @return
330     * @throws ScmException if any
331     */
332    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, boolean recursive )
333        throws ScmException;
334
335    /**
336     * Create a copy of the repository on your local machine.
337     *
338     * @param scmRepository the source control system
339     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
340     * @param version       get the version defined by the revision, branch or tag
341     * @param recursive     whether to check out recursively
342     * @return
343     * @throws ScmException if any
344     */
345    CheckOutScmResult checkOut( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion version,
346                                boolean recursive )
347        throws ScmException;
348
349    /**
350     * Create a diff between two branch/tag/revision.
351     *
352     * @param scmRepository the source control system
353     * @param scmFileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
354     * @param startVersion  the start branch/tag/revision
355     * @param endVersion    the end branch/tag/revision
356     * @return
357     * @throws ScmException if any
358     */
359    DiffScmResult diff( ScmRepository scmRepository, ScmFileSet scmFileSet, ScmVersion startVersion,
360                        ScmVersion endVersion )
361        throws ScmException;
362
363    /**
364     * Make a file editable. This is used in source control systems where you look at read-only files and you need to
365     * make them not read-only anymore before you can edit them. This can also mean that no other user in the system can
366     * make the file not read-only anymore.
367     *
368     * @param repository the source control system
369     * @param fileSet    the files to make editable
370     * @return
371     * @throws ScmException if any
372     */
373    EditScmResult edit( ScmRepository repository, ScmFileSet fileSet )
374        throws ScmException;
375
376    /**
377     * Create an exported copy of the repository on your local machine
378     *
379     * @param repository the source control system
380     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
381     * @return
382     * @throws ScmException if any
383     */
384    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet )
385        throws ScmException;
386
387    /**
388     * Create an exported copy of the repository on your local machine
389     *
390     * @param repository the source control system
391     * @param fileSet    the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
392     * @param version    get the version defined by the branch/tag/revision
393     * @return
394     * @throws ScmException if any
395     */
396    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
397        throws ScmException;
398
399    /**
400     * Create an exported copy of the repository on your local machine
401     *
402     * @param repository      the source control system
403     * @param fileSet         the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
404     * @param outputDirectory the directory where the export will be stored
405     * @return
406     * @throws ScmException if any
407     */
408    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, String outputDirectory )
409        throws ScmException;
410
411    /**
412     * Create an exported copy of the repository on your local machine
413     *
414     * @param repository      the source control system
415     * @param fileSet         the files are copied to the {@link org.apache.maven.scm.ScmFileSet#getBasedir()} location
416     * @param version         get the version defined by the branch/tag/revision
417     * @param outputDirectory the directory where the export will be stored
418     * @return
419     * @throws ScmException if any
420     */
421    ExportScmResult export( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, String outputDirectory )
422        throws ScmException;
423
424    /**
425     * List each element (files and directories) of <B>fileSet</B> as they exist in the repository.
426     *
427     * @param repository the source control system
428     * @param fileSet    the files to list
429     * @param recursive  descend recursively
430     * @param version    use the version defined by the branch/tag/revision
431     * @return the list of files in the repository
432     */
433    ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion version )
434        throws ScmException;
435
436    /**
437     * Create new directory/directories in the repository.
438     *
439     * @param repository
440     * @param fileSet
441     * @param message
442     * @param createInLocal
443     * @return
444     * @throws ScmException
445     */
446    MkdirScmResult mkdir( ScmRepository repository, ScmFileSet fileSet, String message, boolean createInLocal )
447        throws ScmException;
448
449    /**
450     * Removes the given files from the source control system
451     *
452     * @param repository the source control system
453     * @param fileSet    the files to be removed
454     * @param message
455     * @return
456     * @throws ScmException if any
457     */
458    RemoveScmResult remove( ScmRepository repository, ScmFileSet fileSet, String message )
459        throws ScmException;
460
461    /**
462     * Returns the status of the files in the source control system. The state of each file can be one of the
463     * {@link org.apache.maven.scm.ScmFileStatus} flags.
464     *
465     * @param repository the source control system
466     * @param fileSet    the files to know the status about. Implementations can also give the changes from the
467     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
468     * @return
469     * @throws ScmException if any
470     */
471    StatusScmResult status( ScmRepository repository, ScmFileSet fileSet )
472        throws ScmException;
473
474    /**
475     * Tag (or label in some systems) will tag the source file with a certain tag
476     *
477     * @param repository the source control system
478     * @param fileSet    the files to tag. Implementations can also give the changes from the
479     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
480     * @param tagName    the tag name to apply to the files
481     * @return
482     * @throws ScmException if any
483     */
484    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName )
485        throws ScmException;
486
487    /**
488     * Tag (or label in some systems) will tag the source file with a certain tag
489     *
490     * @param repository the source control system
491     * @param fileSet    the files to tag. Implementations can also give the changes from the
492     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
493     * @param tagName    the tag name to apply to the files
494     * @param message    the commit message used for the tag creation
495     * @return
496     * @throws ScmException if any
497     */
498    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, String message )
499        throws ScmException;
500
501    /**
502     * Make a file no longer editable. This is the conterpart of
503     * {@link #edit(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)}. It makes the file
504     * read-only again.
505     *
506     * @param repository the source control system
507     * @param fileSet    the files to make uneditable
508     * @return
509     * @throws ScmException if any
510     */
511    UnEditScmResult unedit( ScmRepository repository, ScmFileSet fileSet )
512        throws ScmException;
513
514    /**
515     * Updates the copy on the local machine with the changes in the repository
516     *
517     * @param repository the source control system
518     * @param fileSet    location of your local copy
519     * @return
520     * @throws ScmException if any
521     */
522    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet )
523        throws ScmException;
524
525    /**
526     * Updates the copy on the local machine with the changes in the repository
527     *
528     * @param repository the source control system
529     * @param fileSet    location of your local copy
530     * @param version    use the version defined by the branch/tag/revision
531     * @return
532     * @throws ScmException if any
533     */
534    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
535        throws ScmException;
536
537    /**
538     * Updates the copy on the local machine with the changes in the repository
539     *
540     * @param repository   the source control system
541     * @param fileSet      location of your local copy
542     * @param runChangelog Run the changelog command after the update
543     * @return
544     * @throws ScmException if any
545     */
546    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, boolean runChangelog )
547        throws ScmException;
548
549    /**
550     * Updates the copy on the local machine with the changes in the repository
551     *
552     * @param repository   the source control system
553     * @param fileSet      location of your local copy
554     * @param version      use the version defined by the branch/tag/revision
555     * @param runChangelog Run the changelog command after the update
556     * @return
557     * @throws ScmException if any
558     */
559    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, boolean runChangelog )
560        throws ScmException;
561
562    /**
563     * Updates the copy on the local machine with the changes in the repository
564     *
565     * @param repository  the source control system
566     * @param fileSet     location of your local copy
567     * @param datePattern the date pattern use in changelog output returned by scm tool
568     * @return
569     * @throws ScmException if any
570     */
571    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String datePattern )
572        throws ScmException;
573
574    /**
575     * Updates the copy on the local machine with the changes in the repository
576     *
577     * @param repository  the source control system
578     * @param fileSet     location of your local copy
579     * @param version     use the version defined by the branch/tag/revision
580     * @param datePattern the date pattern use in changelog output returned by scm tool
581     * @return
582     * @throws ScmException if any
583     */
584    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, String datePattern )
585        throws ScmException;
586
587    /**
588     * Updates the copy on the local machine with the changes in the repository
589     *
590     * @param repository the source control system
591     * @param fileSet    location of your local copy
592     * @param lastUpdate
593     * @return
594     * @throws ScmException if any
595     */
596    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate )
597        throws ScmException;
598
599    /**
600     * Updates the copy on the local machine with the changes in the repository
601     *
602     * @param repository the source control system
603     * @param fileSet    location of your local copy
604     * @param version    use the version defined by the branch/tag/revision
605     * @param lastUpdate
606     * @return
607     * @throws ScmException if any
608     */
609    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate )
610        throws ScmException;
611
612    /**
613     * Updates the copy on the local machine with the changes in the repository
614     *
615     * @param repository  the source control system
616     * @param fileSet     location of your local copy
617     * @param lastUpdate  Date of last update
618     * @param datePattern the date pattern use in changelog output returned by scm tool
619     * @return
620     * @throws ScmException if any
621     */
622    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate, String datePattern )
623        throws ScmException;
624
625    /**
626     * Updates the copy on the local machine with the changes in the repository
627     *
628     * @param repository  the source control system
629     * @param fileSet     location of your local copy
630     * @param version     use the version defined by the branch/tag/revision
631     * @param lastUpdate  Date of last update
632     * @param datePattern the date pattern use in changelog output returned by scm tool
633     * @return
634     * @throws ScmException if any
635     */
636    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate,
637                            String datePattern )
638        throws ScmException;
639
640    /**
641     * Returns the blame of specified file
642     *
643     * @param repository the source control system
644     * @param fileSet    location of your local copy
645     * @param filename   file
646     * @return blame for specified file
647     * @throws ScmException if any
648     * @since 1.4
649     */
650    BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
651        throws ScmException;
652
653    /**
654     * @param blameScmRequest
655     * @return blame for specified file
656     * @throws ScmException if any
657     * @since 1.4
658     */
659    BlameScmResult blame( BlameScmRequest blameScmRequest )
660        throws ScmException;
661}