annotate mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java @ 611:a6c708e5bb10

TW-30920 - never use path returned by CheckoutRules.map() method + fix in exception handler
author Pavel.Sher
date Wed, 24 Jul 2013 17:19:53 +0200
parents 6c480513e5c2
children da9ab34663d8
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);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
46 Map<String, String> revisions = new HashMap<String, String>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
47 revisions.putAll(getBookmarkRevisions(hgRoot));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
48 revisions.putAll(getBranchesRevisions(hgRoot));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
49 String defaultBranchName = hgRoot.getBranchName();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
50 if (revisions.get(defaultBranchName) == null) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
51 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
52 defaultBranchName + "' of vcs root " + myVcs.describeVcsRoot(root));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
53 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
54 return RepositoryStateData.createVersionState(defaultBranchName, revisions);
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
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
58 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
59 private Map<String, String> getBranchesRevisions(@NotNull HgVcsRoot root) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
60 HgRepo repo = myVcs.createRepo(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
61 return repo.branches().call();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
62 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
63
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 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
66 private Map<String, String> getBookmarkRevisions(@NotNull HgVcsRoot root) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
67 ServerHgRepo repo = myVcs.createRepo(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
68 if (!myConfig.bookmarksEnabled())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
69 return emptyMap();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
70 HgVersion version = repo.version().call();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
71 if (!version.isEqualsOrGreaterThan(BookmarksCommand.REQUIRED_HG_VERSION))
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
72 return emptyMap();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
73 return repo.bookmarks().call();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
74 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
75
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
76
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
77 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
78 public List<ModificationData> collectChanges(@NotNull VcsRoot fromRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
79 @NotNull RepositoryStateData fromState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
80 @NotNull VcsRoot toRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
81 @NotNull RepositoryStateData toState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
82 @NotNull CheckoutRules rules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
83 return collectChanges(toRoot, fromState, toState, rules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
84 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
85
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
86
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
87 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
88 public List<ModificationData> collectChanges(@NotNull VcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
89 @NotNull RepositoryStateData fromState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
90 @NotNull RepositoryStateData toState,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
91 @NotNull CheckoutRules rules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
92 List<ModificationData> changes = new ArrayList<ModificationData>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
93 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
94 OperationContext ctx = new OperationContext(myVcs, myRepoFactory, myHgPathProvider, fromState, toState);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
95 for (Map.Entry<String, String> entry : toState.getBranchRevisions().entrySet()) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
96 String branch = entry.getKey();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
97 String toRevision = entry.getValue();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
98 String fromRevision = fromState.getBranchRevisions().get(branch);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
99 if (fromRevision == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
100 fromRevision = fromState.getBranchRevisions().get(fromState.getDefaultBranchName());
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
101 if (toRevision.equals(fromRevision) || fromRevision == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
102 continue;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
103
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
104 Collection<String> fromRevisions = ctx.getFromRevisionsForBranch(hgRoot, fromRevision, toRevision);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
105 List<ModificationData> branchChanges = collectChanges(ctx, root, fromRevisions, toRevision, rules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
106 for (ModificationData change : branchChanges) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
107 if (!ctx.isReportedModification(change)) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
108 changes.add(change);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
109 ctx.markAsReported(change);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
110 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
111 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
112 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
113 changes.addAll(getSubrepoChanges(ctx, root, changes));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
114 return changes;
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 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
119 public List<ModificationData> collectChanges(@NotNull VcsRoot fromRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
120 @NotNull String fromRootRevision,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
121 @NotNull VcsRoot toRoot,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
122 @Nullable String toRootRevision,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
123 @NotNull CheckoutRules checkoutRules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
124 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(toRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
125 myVcs.syncRepository(hgRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
126 String toRevision = toRootRevision != null ? toRootRevision : myVcs.getCurrentVersion(toRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
127 String mergeBase = getMergeBase(hgRoot, fromRootRevision, toRevision);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
128 if (mergeBase == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
129 return Collections.emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
130 return collectChanges(toRoot, mergeBase, toRootRevision, checkoutRules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
131 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
132
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
133
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
134 public List<ModificationData> collectChanges(@NotNull VcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
135 @NotNull String fromVersion,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
136 @Nullable String currentVersion,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
137 @NotNull CheckoutRules checkoutRules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
138 if (currentVersion == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
139 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
140 OperationContext ctx = new OperationContext(myVcs, myRepoFactory, myHgPathProvider, fromVersion, currentVersion);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
141 List<ModificationData> changes = collectChanges(ctx, root, asList(fromVersion), currentVersion, checkoutRules);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
142 changes.addAll(getSubrepoChanges(ctx, root, changes));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
143 return changes;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
144 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
145
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
146
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
147 @Nullable
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
148 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
149 String result = myVcs.createRepo(root).mergeBase()
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
150 .revision1(revision1)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
151 .revision2(revision2)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
152 .call();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
153 if (result == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
154 result = getMinusNthCommit(root, 10);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
155 return result;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
156 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
157
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
158
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
159 @Nullable
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
160 private String getMinusNthCommit(@NotNull HgVcsRoot root, int n) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
161 LogCommand log = myVcs.createRepo(root).log()
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
162 .inBranch(root.getBranchName())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
163 .toNamedRevision(root.getBranchName());
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
164 if (n > 0)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
165 log.setLimit(n);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
166 List<ChangeSet> changeSets = log.call();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
167 if (changeSets.isEmpty())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
168 return null;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
169 return changeSets.get(0).getId();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
170 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
171
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 private List<ModificationData> collectChanges(@NotNull OperationContext ctx,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
174 @NotNull VcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
175 @NotNull Collection<String> fromVersion,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
176 @Nullable String currentVersion,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
177 @NotNull CheckoutRules checkoutRules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
178 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
179 ctx.syncRepository(hgRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
180 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
181 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
182 //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
183 //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
184 //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
185 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
186 for (ChangeSet cset : csets) {
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
187 result.add(createModificationData(ctx, cset, root, checkoutRules));
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
188 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
189 return result;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
190 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
191
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
192
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
193 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
194 private List<ChangeSet> getChangesets(@NotNull OperationContext ctx,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
195 @NotNull final HgVcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
196 @NotNull final Collection<String> fromVersions,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
197 @Nullable final String toVersion) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
198 if (toVersion == null)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
199 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
200 List<String> fromCommits = new ArrayList<String>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
201 for (String fromVersion : fromVersions) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
202 fromCommits.add(new ChangeSetRevision(fromVersion).getId());
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 String toCommit = new ChangeSetRevision(toVersion).getId();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
205 try {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
206 ServerHgRepo repo = myVcs.createRepo(ctx, root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
207 List<ChangeSet> csets = repo.collectChanges(root)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
208 .fromRevision(fromCommits)
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
209 .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
210 .includeFromRevision(ctx.includeFromRevisions())
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
211 .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
212 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
213 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
214 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
215 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
216 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
217 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
218 }
567
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 return csets;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
221 } catch (UnknownRevisionException e) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
222 Loggers.VCS.warn("Revision '" + e.getRevision() + "' is unknown, will return no changes");
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 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
225 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
226
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
227
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
228 private ModificationData createModificationData(@NotNull OperationContext ctx,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
229 @NotNull final ChangeSet cset,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
230 @NotNull final VcsRoot root,
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
231 @NotNull final CheckoutRules checkoutRules) throws VcsException {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
232 List<ChangeSetRevision> parents = cset.getParents();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
233 if (parents.isEmpty())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
234 throw new IllegalStateException("Commit " + cset.getId() + " has no parents");
576
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
235 String version = ctx.getStringFromPool(cset.getId());
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
236 List<VcsChange> files = toVcsChanges(ctx, cset.getModifiedFiles(), ctx.getStringFromPool(parents.get(0).getId()), version, checkoutRules);
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
237 final ModificationData result = new ModificationData(cset.getTimestamp(), files, cset.getDescription(),
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
238 ctx.getStringFromPool(cset.getUser()), root, version, version);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
239 for (ChangeSetRevision parent : parents) {
576
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
240 result.addParentRevision(ctx.getStringFromPool(parent.getId()));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
241 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
242 setCanBeIgnored(result, cset);
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
243 result.setAttributes(getAttributes(ctx, root, result));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
244 return result;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
245 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
246
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
247
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
248 private void setCanBeIgnored(@NotNull ModificationData md, @NotNull ChangeSet cset) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
249 if (md.getParentRevisions().size() > 1) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
250 //don't ignore merge commits
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
251 md.setCanBeIgnored(false);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
252 } else if (cset.getModifiedFiles().isEmpty()) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
253 //don't ignore empty commits
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
254 md.setCanBeIgnored(false);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
255 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
256 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
257
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
258
576
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
259 private List<VcsChange> toVcsChanges(@NotNull OperationContext ctx,
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
260 @NotNull List<FileStatus> modifiedFiles,
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
261 @NotNull String prevVer,
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
262 @NotNull String curVer,
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
263 @NotNull CheckoutRules rules) {
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
264 List<VcsChange> files = new ArrayList<VcsChange>(0);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
265 for (FileStatus mf: modifiedFiles) {
611
a6c708e5bb10 TW-30920 - never use path returned by CheckoutRules.map() method + fix in exception handler
Pavel.Sher
parents: 600
diff changeset
266 if (rules.map(mf.getPath()) == null)
576
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
267 continue;
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
268 String normalizedPath = PathUtil.normalizeSeparator(mf.getPath());
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
269 VcsChangeInfo.Type changeType = getChangeType(mf.getStatus());
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
270 if (changeType == null) {
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
271 Loggers.VCS.warn("Unable to convert status: " + mf.getStatus() + " to VCS change type");
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
272 changeType = VcsChangeInfo.Type.NOT_CHANGED;
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
273 }
611
a6c708e5bb10 TW-30920 - never use path returned by CheckoutRules.map() method + fix in exception handler
Pavel.Sher
parents: 600
diff changeset
274 String path = ctx.getStringFromPool(normalizedPath);
a6c708e5bb10 TW-30920 - never use path returned by CheckoutRules.map() method + fix in exception handler
Pavel.Sher
parents: 600
diff changeset
275 files.add(new VcsChange(changeType, mf.getStatus().getName(), path, path, prevVer, curVer));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
276 }
576
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
277 if (files.isEmpty())
0dfa9ed1039a Reuse strings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 574
diff changeset
278 return emptyList();
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
279 return files;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
280 }
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 private VcsChangeInfo.Type getChangeType(final Status status) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
284 switch (status) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
285 case ADDED:return VcsChangeInfo.Type.ADDED;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
286 case MODIFIED:return VcsChangeInfo.Type.CHANGED;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
287 case REMOVED:return VcsChangeInfo.Type.REMOVED;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
288 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
289 return null;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
290 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
291
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
292
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
293 @NotNull
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
294 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
295 if (changes.isEmpty())
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
296 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
297
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
298 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
299
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
300 HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
301 if (!detectSubrepoChanges(hgRoot))
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
302 return emptyList();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
303
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
304 List<HgSubrepoConfigChange> subrepoConfigChanges = getSubrepoConfigChanges(ctx, changes);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
305 List<ModificationData> subrepoChanges = new ArrayList<ModificationData>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
306
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
307 for (HgSubrepoConfigChange configChange : subrepoConfigChanges) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
308 SubRepo current = configChange.getCurrent();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
309 assert current != null;
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
310
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
311 String subrepoUrl = current.url();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
312 String curRevision = current.revision();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
313 List<String> prevRevisions = new ArrayList<String>(0);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
314 for (SubRepo prevSubrepo : configChange.getPrevious()) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
315 prevRevisions.add(prevSubrepo.revision());
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
316 }
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
317 String path = configChange.getPath();
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
318
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
319 Map<String, String> subrepoParams = new HashMap<String, String>(hgRoot.getProperties());
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
320 subrepoParams.put(Constants.REPOSITORY_PROP, subrepoUrl);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
321 subrepoParams.put("teamcity.internal.subrepo", "true");
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
322 subrepoParams.put("teamcity.internal.subrepo.path", path);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
323
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
324 VcsRootImpl subrepo = new VcsRootImpl(root.getId(), subrepoParams);
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
325 if (ctx.isProcessedSubrepoChanges(subrepo, prevRevisions, curRevision))
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
326 continue;
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
327 List<ModificationData> subChanges = collectChanges(ctx, subrepo, prevRevisions, curRevision, CheckoutRules.DEFAULT);
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
328 for (ModificationData m : subChanges) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
329 if (!ctx.isReportedModification(m)) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
330 subrepoChanges.add(m);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
331 ctx.markAsReported(m);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
332 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
333 }
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
334 ctx.markProcessedSubrepoChanges(subrepo, prevRevisions, curRevision);
567
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
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
337 List<ModificationData> subSubrepoChanges = getSubrepoChanges(ctx, root, subrepoChanges);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
338 subrepoChanges.addAll(subSubrepoChanges);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
339 return subrepoChanges;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
340 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
341
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
342
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
343 private boolean detectSubrepoChanges(@NotNull HgVcsRoot root) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
344 return myConfig.detectSubrepoChanges() && root.detectSubrepoChanges();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
345 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
346
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
347
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
348 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
349 List<HgSubrepoConfigChange> subrepoConfigChanges = new ArrayList<HgSubrepoConfigChange>();
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
350 for (ModificationData m : mainRootChanges) {
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
351 subrepoConfigChanges.addAll(getSubrepoConfigChanges(ctx, m));
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
352 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
353 return subrepoConfigChanges;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
354 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
355
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
356
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
357 @NotNull
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
358 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
359 List<HgSubrepoConfigChange> configChanges = new ArrayList<HgSubrepoConfigChange>();
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
360
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
361 HgVcsRoot mainRoot = myHgVcsRootFactory.createHgRoot(m.getVcsRoot());
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
362 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
363 for (HgSubrepoConfigChange c : repo.getSubrepoConfigChanges(m)) {
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
364 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
365 //map url and path, relative to the main repository
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
366 try {
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
367 SubRepo currentSubrepo = c.getCurrent();
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
368 assert currentSubrepo != null;
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
369 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
370 String curRevision = ctx.getStringFromPool(currentSubrepo.revision());
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
371 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
372 String path = ctx.getStringFromPool(mainRoot.expandSubrepoPath(c.getPath()));
595
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
373 for (SubRepo prevSubrepo : c.getPrevious()) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
374 prevSubrepos.add(new SubRepo(path, subrepoUrl, ctx.getStringFromPool(prevSubrepo.revision())));
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
375 }
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
376 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
377 } catch (URISyntaxException e) {
f2a2bf159f4c Eliminate SubrepoConfigChange usages
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 594
diff changeset
378 throw new VcsException(e);
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
379 }
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
380 }
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
381 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
382 return configChanges;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
383 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
384
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
385
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
386 @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
387 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
388 Map<String, String> attributes = new HashMap<String, String>();
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
389 HgVcsRoot root = myHgVcsRootFactory.createHgRoot(mainRoot);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
390 if (detectSubrepoChanges(root)) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
391 try {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
392 ServerHgRepo repo = myVcs.createRepo(ctx, root);
593
ad112e314be5 Report subrepo revision in each commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 592
diff changeset
393 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
394 for (SubRepo s : repo.getSubrepositories(m).values()) {
594
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
395 attrBuilder.addSubrepo(new SubrepoConfig(root)
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
396 .setSubrepoPath(ctx.getStringFromPool(root.expandSubrepoPath(s.path())))
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
397 .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
398 .setSubrepoRootParamDiff("teamcity.internal.subrepo", "true")
9cbf9205208e Do not report subrepo config changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 593
diff changeset
399 .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
400 .setSubrepoRevision(ctx.getStringFromPool(s.revision())));
593
ad112e314be5 Report subrepo revision in each commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 592
diff changeset
401 }
ad112e314be5 Report subrepo revision in each commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 592
diff changeset
402 attributes.putAll(attrBuilder.buildAttributes());
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
403 } catch (Exception e) {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
404 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
405 if (e instanceof VcsException)
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
406 throw (VcsException) e;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
407 throw new VcsException(e);
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
408 }
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
409 }
574
0b7e05418aa2 Reuse empty maps to reduce memory
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 568
diff changeset
410 if (attributes.isEmpty())
0b7e05418aa2 Reuse empty maps to reduce memory
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 568
diff changeset
411 return emptyMap();
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
412 return attributes;
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
413 }
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
414
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
415 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
416 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
417 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
418 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
419 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
420 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
421 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
422 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
423 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
424 }
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 595
diff changeset
425 }
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
426 }