annotate mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java @ 713:41013464149f

fix prefix message
author eugene.petrenko@jetbrains.com
date Mon, 13 Jan 2014 15:25:54 +0100
parents a07f685ce394
children d1469a7cc038
rev   line source
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
1 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
2
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
3 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
4 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.UnknownRevisionException;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
5 import jetbrains.buildServer.log.Loggers;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
6 import jetbrains.buildServer.vcs.*;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
7 import jetbrains.buildServer.vcs.impl.VcsRootImpl;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
8 import org.jetbrains.annotations.NotNull;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
9 import org.jetbrains.annotations.Nullable;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
10
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
11 import java.net.URISyntaxException;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
12 import java.util.*;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
13
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
14 import static java.util.Arrays.asList;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
15 import static java.util.Collections.emptyList;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
16 import static java.util.Collections.emptyMap;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
17
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
18 public class MercurialCollectChangesPolicy implements CollectChangesBetweenRoots, CollectChangesBetweenRepositories {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
19
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
20 private final static AscendingRevNums ASCENDING_REV_NUMS = new AscendingRevNums();
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
21
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
22 private final MercurialVcsSupport myVcs;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
23 private final ServerPluginConfig myConfig;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
24 private final HgVcsRootFactory myHgVcsRootFactory;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
25 private final RepoFactory myRepoFactory;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
26 private final HgPathProvider myHgPathProvider;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
27
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
28
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
29 public MercurialCollectChangesPolicy(@NotNull MercurialVcsSupport vcs,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
30 @NotNull ServerPluginConfig config,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
31 @NotNull HgVcsRootFactory hgVcsRootFactory,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
32 @NotNull RepoFactory repoFactory,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
33 @NotNull HgPathProvider hgPathProvider) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
34 myVcs = vcs;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
35 myConfig = config;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
36 myHgVcsRootFactory = hgVcsRootFactory;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
37 myRepoFactory = repoFactory;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
38 myHgPathProvider = hgPathProvider;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
39 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
40
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
41
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
42 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
43 public RepositoryStateData getCurrentState(@NotNull VcsRoot root) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
44 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
45 myVcs.syncRepository(hgRoot);
649
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
46 boolean includeTags = myConfig.useTagsAsBranches() && hgRoot.useTagsAsBranches();
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
47 Map<String, String> revisions = myVcs.createRepo(hgRoot).getBranchRevisions(myConfig.bookmarksEnabled(), includeTags);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
48 String defaultBranchName = hgRoot.getBranchName();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
49 if (revisions.get(defaultBranchName) == null) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
50 throw new VcsException("Cannot find revision of the default branch '" +
590
87754c01d304 LogUtil is not available in vcs worker + remove duplicates
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
51 defaultBranchName + "' of vcs root " + myVcs.describeVcsRoot(root));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
52 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
53 return RepositoryStateData.createVersionState(defaultBranchName, revisions);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
54 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
55
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
56
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
57 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
58 public List<ModificationData> collectChanges(@NotNull VcsRoot fromRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
59 @NotNull RepositoryStateData fromState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
60 @NotNull VcsRoot toRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
61 @NotNull RepositoryStateData toState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
62 @NotNull CheckoutRules rules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
63 return collectChanges(toRoot, fromState, toState, rules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
64 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
65
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
66
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
67 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
68 public List<ModificationData> collectChanges(@NotNull VcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
69 @NotNull RepositoryStateData fromState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
70 @NotNull RepositoryStateData toState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
71 @NotNull CheckoutRules rules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
72 List<ModificationData> changes = new ArrayList<ModificationData>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
73 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
74 OperationContext ctx = new OperationContext(myVcs, myRepoFactory, myHgPathProvider, fromState, toState);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
75 for (Map.Entry<String, String> entry : toState.getBranchRevisions().entrySet()) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
76 String branch = entry.getKey();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
77 String toRevision = entry.getValue();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
78 String fromRevision = fromState.getBranchRevisions().get(branch);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
79 if (fromRevision == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
80 fromRevision = fromState.getBranchRevisions().get(fromState.getDefaultBranchName());
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
81 if (toRevision.equals(fromRevision) || fromRevision == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
82 continue;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
83
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
84 Collection<String> fromRevisions = ctx.getFromRevisionsForBranch(hgRoot, fromRevision, toRevision);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
85 List<ModificationData> branchChanges = collectChanges(ctx, root, fromRevisions, toRevision, rules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
86 for (ModificationData change : branchChanges) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
87 if (!ctx.isReportedModification(change)) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
88 changes.add(change);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
89 ctx.markAsReported(change);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
90 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
91 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
92 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
93 changes.addAll(getSubrepoChanges(ctx, root, changes));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
94 return changes;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
95 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
96
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
97
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
98 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
99 public List<ModificationData> collectChanges(@NotNull VcsRoot fromRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
100 @NotNull String fromRootRevision,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
101 @NotNull VcsRoot toRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
102 @Nullable String toRootRevision,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
103 @NotNull CheckoutRules checkoutRules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
104 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(toRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
105 myVcs.syncRepository(hgRoot);
696
a07f685ce394 Get rid of depricated getCurrentVersion() method
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 691
diff changeset
106 String toRevision = toRootRevision;
a07f685ce394 Get rid of depricated getCurrentVersion() method
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 691
diff changeset
107 if (toRevision == null) {
a07f685ce394 Get rid of depricated getCurrentVersion() method
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 691
diff changeset
108 RepositoryStateData state = myVcs.getCollectChangesPolicy().getCurrentState(toRoot);
a07f685ce394 Get rid of depricated getCurrentVersion() method
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 691
diff changeset
109 toRevision = state.getBranchRevisions().get(state.getDefaultBranchName());
a07f685ce394 Get rid of depricated getCurrentVersion() method
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 691
diff changeset
110 }
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
111 String mergeBase = getMergeBase(hgRoot, fromRootRevision, toRevision);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
112 if (mergeBase == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
113 return Collections.emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
114 return collectChanges(toRoot, mergeBase, toRootRevision, checkoutRules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
115 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
116
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
117
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
118 public List<ModificationData> collectChanges(@NotNull VcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
119 @NotNull String fromVersion,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
120 @Nullable String currentVersion,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
121 @NotNull CheckoutRules checkoutRules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
122 if (currentVersion == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
123 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
124 OperationContext ctx = new OperationContext(myVcs, myRepoFactory, myHgPathProvider, fromVersion, currentVersion);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
125 List<ModificationData> changes = collectChanges(ctx, root, asList(fromVersion), currentVersion, checkoutRules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
126 changes.addAll(getSubrepoChanges(ctx, root, changes));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
127 return changes;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
128 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
129
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
130
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
131 @Nullable
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
132 private String getMergeBase(@NotNull HgVcsRoot root, @NotNull String revision1, @NotNull String revision2) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
133 String result = myVcs.createRepo(root).mergeBase()
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
134 .revision1(revision1)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
135 .revision2(revision2)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
136 .call();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
137 if (result == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
138 result = getMinusNthCommit(root, 10);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
139 return result;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
140 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
141
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
142
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
143 @Nullable
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
144 private String getMinusNthCommit(@NotNull HgVcsRoot root, int n) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
145 LogCommand log = myVcs.createRepo(root).log()
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
146 .inBranch(root.getBranchName())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
147 .toNamedRevision(root.getBranchName());
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
148 if (n > 0)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
149 log.setLimit(n);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
150 List<ChangeSet> changeSets = log.call();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
151 if (changeSets.isEmpty())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
152 return null;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
153 return changeSets.get(0).getId();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
154 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
155
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
156
656
32d2a04206c8 Implement ModificationInfoBuilder
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
157 public List<ModificationData> collectChanges(@NotNull OperationContext ctx,
32d2a04206c8 Implement ModificationInfoBuilder
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
158 @NotNull VcsRoot root,
32d2a04206c8 Implement ModificationInfoBuilder
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
159 @NotNull Collection<String> fromVersion,
32d2a04206c8 Implement ModificationInfoBuilder
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
160 @Nullable String currentVersion,
32d2a04206c8 Implement ModificationInfoBuilder
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
161 @NotNull CheckoutRules checkoutRules) throws VcsException {
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
162 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
163 ctx.syncRepository(hgRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
164 List<ModificationData> result = new ArrayList<ModificationData>();
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
165 List<ChangeSet> csets = getChangesets(ctx, hgRoot, fromVersion, currentVersion);
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
166 //When commit has no changes in subrepo configuration we can reuse
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
167 //subrepo revision table calculated for its parent commit(s). To do
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
168 //that parents should be processed before children:
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
169 Collections.sort(csets, ASCENDING_REV_NUMS);
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
170 for (ChangeSet cset : csets) {
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
171 result.add(createModificationData(ctx, cset, root, checkoutRules));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
172 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
173 return result;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
174 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
175
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
176
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
177 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
178 private List<ChangeSet> getChangesets(@NotNull OperationContext ctx,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
179 @NotNull final HgVcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
180 @NotNull final Collection<String> fromVersions,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
181 @Nullable final String toVersion) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
182 if (toVersion == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
183 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
184 List<String> fromCommits = new ArrayList<String>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
185 for (String fromVersion : fromVersions) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
186 fromCommits.add(new ChangeSetRevision(fromVersion).getId());
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
187 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
188 String toCommit = new ChangeSetRevision(toVersion).getId();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
189 try {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
190 ServerHgRepo repo = myVcs.createRepo(ctx, root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
191 List<ChangeSet> csets = repo.collectChanges(root)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
192 .fromRevision(fromCommits)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
193 .toRevision(toCommit)
568
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
194 .includeFromRevision(ctx.includeFromRevisions())
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
195 .call();
568
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
196 if (!ctx.includeFromRevisions()) {
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
197 Iterator<ChangeSet> iter = csets.iterator();
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
198 while (iter.hasNext()) {
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
199 ChangeSet cset = iter.next();
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
200 if (fromVersions.contains(cset.getId()))
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
201 iter.remove();
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
202 }
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
203 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
204 return csets;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
205 } catch (UnknownRevisionException e) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
206 Loggers.VCS.warn("Revision '" + e.getRevision() + "' is unknown, will return no changes");
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
207 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
208 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
209 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
210
691
d4ef6a366768 extract code to utility
eugene.petrenko@gmail.com
parents: 656
diff changeset
211 private ModificationData createModificationData(@NotNull final OperationContext ctx,
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
212 @NotNull final ChangeSet cset,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
213 @NotNull final VcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
214 @NotNull final CheckoutRules checkoutRules) throws VcsException {
691
d4ef6a366768 extract code to utility
eugene.petrenko@gmail.com
parents: 656
diff changeset
215 final ModificationData result = ModificationDataFactory.createModificationData(ctx, cset, root, checkoutRules);
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
216 result.setAttributes(getAttributes(ctx, root, result));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
217 return result;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
218 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
219
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
220 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
221 private List<ModificationData> getSubrepoChanges(@NotNull OperationContext ctx, @NotNull VcsRoot root, @NotNull List<ModificationData> changes) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
222 if (changes.isEmpty())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
223 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
224
568
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
225 ctx.setIncludeFromRevisions(true);
333a1ddcbf94 Changes from subrepos should include from revisions otherwise TeamCity doesn't show them in UI
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
226
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
227 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
228 if (!detectSubrepoChanges(hgRoot))
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
229 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
230
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
231 List<HgSubrepoConfigChange> subrepoConfigChanges = getSubrepoConfigChanges(ctx, changes);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
232 List<ModificationData> subrepoChanges = new ArrayList<ModificationData>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
233
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
234 for (HgSubrepoConfigChange configChange : subrepoConfigChanges) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
235 SubRepo current = configChange.getCurrent();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
236 assert current != null;
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
237
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
238 String subrepoUrl = current.url();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
239 String curRevision = current.revision();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
240 List<String> prevRevisions = new ArrayList<String>(0);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
241 for (SubRepo prevSubrepo : configChange.getPrevious()) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
242 prevRevisions.add(prevSubrepo.revision());
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
243 }
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
244 String path = configChange.getPath();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
245
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
246 Map<String, String> subrepoParams = new HashMap<String, String>(hgRoot.getProperties());
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
247 subrepoParams.put(Constants.REPOSITORY_PROP, subrepoUrl);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
248 subrepoParams.put("teamcity.internal.subrepo", "true");
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
249 subrepoParams.put("teamcity.internal.subrepo.path", path);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
250
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
251 VcsRootImpl subrepo = new VcsRootImpl(root.getId(), subrepoParams);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
252 if (ctx.isProcessedSubrepoChanges(subrepo, prevRevisions, curRevision))
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
253 continue;
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
254 List<ModificationData> subChanges = collectChanges(ctx, subrepo, prevRevisions, curRevision, CheckoutRules.DEFAULT);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
255 for (ModificationData m : subChanges) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
256 if (!ctx.isReportedModification(m)) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
257 subrepoChanges.add(m);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
258 ctx.markAsReported(m);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
259 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
260 }
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
261 ctx.markProcessedSubrepoChanges(subrepo, prevRevisions, curRevision);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
262 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
263
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
264 List<ModificationData> subSubrepoChanges = getSubrepoChanges(ctx, root, subrepoChanges);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
265 subrepoChanges.addAll(subSubrepoChanges);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
266 return subrepoChanges;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
267 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
268
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
269
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
270 private boolean detectSubrepoChanges(@NotNull HgVcsRoot root) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
271 return myConfig.detectSubrepoChanges() && root.detectSubrepoChanges();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
272 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
273
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
274
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
275 private List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull OperationContext ctx, @NotNull List<ModificationData> mainRootChanges) throws VcsException {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
276 List<HgSubrepoConfigChange> subrepoConfigChanges = new ArrayList<HgSubrepoConfigChange>();
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
277 for (ModificationData m : mainRootChanges) {
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
278 subrepoConfigChanges.addAll(getSubrepoConfigChanges(ctx, m));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
279 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
280 return subrepoConfigChanges;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
281 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
282
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
283
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
284 @NotNull
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
285 private List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull OperationContext ctx, @NotNull ModificationData m) throws VcsException {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
286 List<HgSubrepoConfigChange> configChanges = new ArrayList<HgSubrepoConfigChange>();
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
287
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
288 HgVcsRoot mainRoot = myHgVcsRootFactory.createHgRoot(m.getVcsRoot());
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
289 ServerHgRepo repo = myVcs.createRepo(ctx, mainRoot);
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
290 for (HgSubrepoConfigChange c : repo.getSubrepoConfigChanges(m)) {
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
291 if (!(c.subrepoUrlChanged() || c.subrepoAdded() || c.subrepoRemoved())) {//report only changes in revisions, because we collect changes only for such changes
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
292 //map url and path, relative to the main repository
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
293 try {
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
294 SubRepo currentSubrepo = c.getCurrent();
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
295 assert currentSubrepo != null;
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
296 String subrepoUrl = ctx.getStringFromPool(currentSubrepo.resolveUrl(mainRoot.getRepository()));
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
297 String curRevision = ctx.getStringFromPool(currentSubrepo.revision());
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
298 List<SubRepo> prevSubrepos = new ArrayList<SubRepo>(0);
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
299 String path = ctx.getStringFromPool(mainRoot.expandSubrepoPath(c.getPath()));
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
300 for (SubRepo prevSubrepo : c.getPrevious()) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
301 prevSubrepos.add(new SubRepo(path, subrepoUrl, ctx.getStringFromPool(prevSubrepo.revision())));
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
302 }
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
303 configChanges.add(new HgSubrepoConfigChange(path, prevSubrepos, new SubRepo(path, subrepoUrl, curRevision)));
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
304 } catch (URISyntaxException e) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
305 throw new VcsException(e);
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
306 }
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
307 }
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
308 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
309 return configChanges;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
310 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
311
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
312
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
313 @NotNull
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
314 private Map<String, String> getAttributes(@NotNull OperationContext ctx, @NotNull VcsRoot mainRoot, @NotNull ModificationData m) throws VcsException {
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
315 Map<String, String> attributes = new HashMap<String, String>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
316 HgVcsRoot root = myHgVcsRootFactory.createHgRoot(mainRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
317 if (detectSubrepoChanges(root)) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
318 try {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
319 ServerHgRepo repo = myVcs.createRepo(ctx, root);
593
ad112e314be5 Report subrepo revision in each commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 592
diff changeset
320 SubrepoRevisionAttributesBuilder attrBuilder = new SubrepoRevisionAttributesBuilder();
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
321 for (SubRepo s : repo.getSubrepositories(m).values()) {
641
da9ab34663d8 Do not implement VcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 611
diff changeset
322 attrBuilder.addSubrepo(new SubrepoConfig(mainRoot)
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
323 .setSubrepoPath(ctx.getStringFromPool(root.expandSubrepoPath(s.path())))
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
324 .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, ctx.getStringFromPool(s.resolveUrl(root.getRepository())))
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
325 .setSubrepoRootParamDiff("teamcity.internal.subrepo", "true")
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
326 .setSubrepoRootParamDiff("teamcity.internal.subrepo.path", ctx.getStringFromPool(root.expandSubrepoPath(s.path())))
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
327 .setSubrepoRevision(ctx.getStringFromPool(s.revision())));
593
ad112e314be5 Report subrepo revision in each commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 592
diff changeset
328 }
ad112e314be5 Report subrepo revision in each commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 592
diff changeset
329 attributes.putAll(attrBuilder.buildAttributes());
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
330 } catch (Exception e) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
331 Loggers.VCS.warn("Error while reporting subrepo config changes", e);
611
a6c708e5bb10 TW-30920 - never use path returned by CheckoutRules.map() method + fix in exception handler
Pavel.Sher
parents: 600
diff changeset
332 if (e instanceof VcsException)
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
333 throw (VcsException) e;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
334 throw new VcsException(e);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
335 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
336 }
574
0b7e05418aa2 Reuse empty maps to reduce memory
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 568
diff changeset
337 if (attributes.isEmpty())
0b7e05418aa2 Reuse empty maps to reduce memory
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 568
diff changeset
338 return emptyMap();
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
339 return attributes;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
340 }
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
341
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
342 private final static class AscendingRevNums implements Comparator<ChangeSet> {
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
343 public int compare(ChangeSet o1, ChangeSet o2) {
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
344 int revnum1 = o1.getRevNumber();
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
345 int revnum2 = o2.getRevNumber();
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
346 if (revnum1 < revnum2)
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
347 return -1;
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
348 if (revnum1 > revnum2)
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
349 return 1;
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
350 return 0;
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
351 }
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
352 }
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
353 }