001    package 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    
022    import org.apache.maven.scm.ScmBranch;
023    import org.apache.maven.scm.ScmException;
024    import org.apache.maven.scm.ScmFileSet;
025    import org.apache.maven.scm.ScmVersion;
026    import org.apache.maven.scm.command.add.AddScmResult;
027    import org.apache.maven.scm.command.blame.BlameScmRequest;
028    import org.apache.maven.scm.command.blame.BlameScmResult;
029    import org.apache.maven.scm.command.branch.BranchScmResult;
030    import org.apache.maven.scm.command.changelog.ChangeLogScmRequest;
031    import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
032    import org.apache.maven.scm.command.checkin.CheckInScmResult;
033    import org.apache.maven.scm.command.checkout.CheckOutScmResult;
034    import org.apache.maven.scm.command.diff.DiffScmResult;
035    import org.apache.maven.scm.command.edit.EditScmResult;
036    import org.apache.maven.scm.command.export.ExportScmResult;
037    import org.apache.maven.scm.command.list.ListScmResult;
038    import org.apache.maven.scm.command.mkdir.MkdirScmResult;
039    import org.apache.maven.scm.command.remove.RemoveScmResult;
040    import org.apache.maven.scm.command.status.StatusScmResult;
041    import org.apache.maven.scm.command.tag.TagScmResult;
042    import org.apache.maven.scm.command.unedit.UnEditScmResult;
043    import org.apache.maven.scm.command.update.UpdateScmResult;
044    import org.apache.maven.scm.provider.ScmProvider;
045    import org.apache.maven.scm.repository.ScmRepository;
046    import org.apache.maven.scm.repository.ScmRepositoryException;
047    import org.apache.maven.scm.repository.UnknownRepositoryStructure;
048    
049    import java.io.File;
050    import java.util.Date;
051    import 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     * @version $Id: ScmManager.java 1354687 2012-06-27 19:38:56Z olamy $
059     */
060    public 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    }