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 ScmException if any
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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 TODO
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     * @throws ScmException if any
433     */
434    ListScmResult list( ScmRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion version )
435        throws ScmException;
436
437    /**
438     * Create new directory/directories in the repository.
439     *
440     * @param repository TODO
441     * @param fileSet TODO
442     * @param message TODO
443     * @param createInLocal TODO
444     * @return TODO
445     * @throws ScmException if any
446     */
447    MkdirScmResult mkdir( ScmRepository repository, ScmFileSet fileSet, String message, boolean createInLocal )
448        throws ScmException;
449
450    /**
451     * Removes the given files from the source control system
452     *
453     * @param repository the source control system
454     * @param fileSet    the files to be removed
455     * @param message TODO
456     * @return TODO
457     * @throws ScmException if any
458     */
459    RemoveScmResult remove( ScmRepository repository, ScmFileSet fileSet, String message )
460        throws ScmException;
461
462    /**
463     * Returns the status of the files in the source control system. The state of each file can be one of the
464     * {@link org.apache.maven.scm.ScmFileStatus} flags.
465     *
466     * @param repository the source control system
467     * @param fileSet    the files to know the status about. Implementations can also give the changes from the
468     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
469     * @return TODO
470     * @throws ScmException if any
471     */
472    StatusScmResult status( ScmRepository repository, ScmFileSet fileSet )
473        throws ScmException;
474
475    /**
476     * Tag (or label in some systems) will tag the source file with a certain tag
477     *
478     * @param repository the source control system
479     * @param fileSet    the files to tag. Implementations can also give the changes from the
480     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
481     * @param tagName    the tag name to apply to the files
482     * @return TODO
483     * @throws ScmException if any
484     */
485    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName )
486        throws ScmException;
487
488    /**
489     * Tag (or label in some systems) will tag the source file with a certain tag
490     *
491     * @param repository the source control system
492     * @param fileSet    the files to tag. Implementations can also give the changes from the
493     *                   {@link org.apache.maven.scm.ScmFileSet#getBasedir()} downwards.
494     * @param tagName    the tag name to apply to the files
495     * @param message    the commit message used for the tag creation
496     * @return TODO
497     * @throws ScmException if any
498     */
499    TagScmResult tag( ScmRepository repository, ScmFileSet fileSet, String tagName, String message )
500        throws ScmException;
501
502    /**
503     * Make a file no longer editable. This is the conterpart of
504     * {@link #edit(org.apache.maven.scm.repository.ScmRepository, org.apache.maven.scm.ScmFileSet)}. It makes the file
505     * read-only again.
506     *
507     * @param repository the source control system
508     * @param fileSet    the files to make uneditable
509     * @return TODO
510     * @throws ScmException if any
511     */
512    UnEditScmResult unedit( ScmRepository repository, ScmFileSet fileSet )
513        throws ScmException;
514
515    /**
516     * Updates the copy on the local machine with the changes in the repository
517     *
518     * @param repository the source control system
519     * @param fileSet    location of your local copy
520     * @return TODO
521     * @throws ScmException if any
522     */
523    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet )
524        throws ScmException;
525
526    /**
527     * Updates the copy on the local machine with the changes in the repository
528     *
529     * @param repository the source control system
530     * @param fileSet    location of your local copy
531     * @param version    use the version defined by the branch/tag/revision
532     * @return TODO
533     * @throws ScmException if any
534     */
535    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version )
536        throws ScmException;
537
538    /**
539     * Updates the copy on the local machine with the changes in the repository
540     *
541     * @param repository   the source control system
542     * @param fileSet      location of your local copy
543     * @param runChangelog Run the changelog command after the update
544     * @return TODO
545     * @throws ScmException if any
546     */
547    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, boolean runChangelog )
548        throws ScmException;
549
550    /**
551     * Updates the copy on the local machine with the changes in the repository
552     *
553     * @param repository   the source control system
554     * @param fileSet      location of your local copy
555     * @param version      use the version defined by the branch/tag/revision
556     * @param runChangelog Run the changelog command after the update
557     * @return TODO
558     * @throws ScmException if any
559     */
560    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, boolean runChangelog )
561        throws ScmException;
562
563    /**
564     * Updates the copy on the local machine with the changes in the repository
565     *
566     * @param repository  the source control system
567     * @param fileSet     location of your local copy
568     * @param datePattern the date pattern use in changelog output returned by scm tool
569     * @return TODO
570     * @throws ScmException if any
571     */
572    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, String datePattern )
573        throws ScmException;
574
575    /**
576     * Updates the copy on the local machine with the changes in the repository
577     *
578     * @param repository  the source control system
579     * @param fileSet     location of your local copy
580     * @param version     use the version defined by the branch/tag/revision
581     * @param datePattern the date pattern use in changelog output returned by scm tool
582     * @return TODO
583     * @throws ScmException if any
584     */
585    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, String datePattern )
586        throws ScmException;
587
588    /**
589     * Updates the copy on the local machine with the changes in the repository
590     *
591     * @param repository the source control system
592     * @param fileSet    location of your local copy
593     * @param lastUpdate TODO
594     * @return TODO
595     * @throws ScmException if any
596     */
597    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate )
598        throws ScmException;
599
600    /**
601     * Updates the copy on the local machine with the changes in the repository
602     *
603     * @param repository the source control system
604     * @param fileSet    location of your local copy
605     * @param version    use the version defined by the branch/tag/revision
606     * @param lastUpdate TODO
607     * @return TODO
608     * @throws ScmException if any
609     */
610    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate )
611        throws ScmException;
612
613    /**
614     * Updates the copy on the local machine with the changes in the repository
615     *
616     * @param repository  the source control system
617     * @param fileSet     location of your local copy
618     * @param lastUpdate  Date of last update
619     * @param datePattern the date pattern use in changelog output returned by scm tool
620     * @return TODO
621     * @throws ScmException if any
622     */
623    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, Date lastUpdate, String datePattern )
624        throws ScmException;
625
626    /**
627     * Updates the copy on the local machine with the changes in the repository
628     *
629     * @param repository  the source control system
630     * @param fileSet     location of your local copy
631     * @param version     use the version defined by the branch/tag/revision
632     * @param lastUpdate  Date of last update
633     * @param datePattern the date pattern use in changelog output returned by scm tool
634     * @return TODO
635     * @throws ScmException if any
636     */
637    UpdateScmResult update( ScmRepository repository, ScmFileSet fileSet, ScmVersion version, Date lastUpdate,
638                            String datePattern )
639        throws ScmException;
640
641    /**
642     * Returns the blame of specified file
643     *
644     * @param repository the source control system
645     * @param fileSet    location of your local copy
646     * @param filename   file
647     * @return blame for specified file
648     * @throws ScmException if any
649     * @since 1.4
650     */
651    BlameScmResult blame( ScmRepository repository, ScmFileSet fileSet, String filename )
652        throws ScmException;
653
654    /**
655     * @param blameScmRequest TODO
656     * @return blame for specified file
657     * @throws ScmException if any
658     * @since 1.4
659     */
660    BlameScmResult blame( BlameScmRequest blameScmRequest )
661        throws ScmException;
662}