1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
package com.intellij.vcs.log;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vcs.VcsKey;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.Consumer;
import com.intellij.util.messages.MessageBus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
/**
* Provides the information needed to build the VCS log, such as the list of most recent commits with their parents.
*/
public interface VcsLogProvider {
/**
* Reads the most recent correctly ordered commits from the log. <br/>
* Commits should be at least topologically ordered, better considering commit time as well. <br/>
* Commits will be shown in the log in this order.
* @param requirements some limitations on commit data that should be returned.
*/
@NotNull
List<? extends VcsCommitMetadata> readFirstBlock(@NotNull VirtualFile root, @NotNull Requirements requirements) throws VcsException;
/**
* <p>Reads the whole history, but only hashes & parents.</p>
* <p>Also reports authors/committers of this repository to the given user registry.</p>
*/
void readAllHashes(@NotNull VirtualFile root, @NotNull Consumer<VcsUser> userRegistry,
@NotNull Consumer<TimedVcsCommit> commitConsumer) throws VcsException;
/**
* Reads those details of the given commits, which are necessary to be shown in the log table.
*/
@NotNull
List<? extends VcsShortCommitDetails> readShortDetails(@NotNull VirtualFile root, @NotNull List<String> hashes) throws VcsException;
/**
* Read full details of the given commits from the VCS.
*/
@NotNull
List<? extends VcsFullCommitDetails> readFullDetails(@NotNull VirtualFile root, @NotNull List<String> hashes) throws VcsException;
/**
* Read all references (branches, tags, etc.) for the given roots.
*/
@NotNull
Collection<VcsRef> readAllRefs(@NotNull VirtualFile root) throws VcsException;
/**
* <p>Returns the VCS which is supported by this provider.</p>
* <p>If there will be several VcsLogProviders which support the same VCS, only one will be chosen. It is undefined, which one.</p>
*/
@NotNull
VcsKey getSupportedVcs();
/**
* Returns the {@link VcsLogRefManager} which will be used to identify positions of references in the log table, on the branches panel,
* and on the details panel.
*/
@NotNull
VcsLogRefManager getReferenceManager();
/**
* <p>Starts listening to events from the certain VCS, which should lead to the log refresh.</p>
* <p>It is the responsibility of the certain VcsLogProvider to carefully unsubscribe on project dispose.
* Using a {@link MessageBus} topic can help to avoid this task.</p>
*
* @param roots VCS roots which should be listened to.
* @param refresher The refresher which should be notified about the need of refresh.
*/
void subscribeToRootRefreshEvents(@NotNull Collection<VirtualFile> roots, @NotNull VcsLogRefresher refresher);
/**
* <p>Return commits, which correspond to the given filters.</p>
*
* @param maxCount maximum number of commits to request from the VCS, or -1 for unlimited.
*/
@NotNull
List<TimedVcsCommit> getCommitsMatchingFilter(@NotNull VirtualFile root, @NotNull VcsLogFilterCollection filterCollection, int maxCount)
throws VcsException;
/**
* Returns the name of current user as specified for the given root,
* or null if user didn't configure his name in the VCS settings.
*/
@Nullable
VcsUser getCurrentUser(@NotNull VirtualFile root) throws VcsException;
/**
* Returns the list of names of branches/references which contain the given commit.
*/
@NotNull
Collection<String> getContainingBranches(@NotNull VirtualFile root, @NotNull Hash commitHash) throws VcsException;
interface Requirements {
/**
* Returns the number of commits that should be queried from the VCS. <br/>
* (of course it may return less commits if the repository is small)
*/
int getCommitCount();
}
}
|