annotate mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCommitsInfoBuilderSupport.java @ 1024:c0c4bf1db865

TW-66329 fix using archive command for creating full patch: previous implementation using clone produces very large overhead for big project repositories in case when settings are stored in the project repo since in case of freezing build settings, core system asks plugin to build full patch and cloning repos into temp dir even from local mirror can take tens of minutes
author Maxim Zaytsev <Maxim.Zaytsev@jetbrains.com>
date Mon, 15 Jun 2020 13:07:12 +0300
parents 7bf4d943d5bb
children 10dc26b32c35
rev   line source
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
1 /*
976
7bf4d943d5bb Update copyright
pavel.sher
parents: 799
diff changeset
2 * Copyright 2000-2018 JetBrains s.r.o.
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
3 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
5 * you may not use this file except in compliance with the License.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
6 * You may obtain a copy of the License at
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
7 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
9 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
10 * Unless required by applicable law or agreed to in writing, software
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
11 * distributed under the License is distributed on an "AS IS" BASIS,
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
13 * See the License for the specific language governing permissions and
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
14 * limitations under the License.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
15 */
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 731
diff changeset
16
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
17 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
18
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
19 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommitsAndMountPointsCommand;
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
20 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot;
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
21 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.LogCommand;
731
5becb1dfecbd make it compile (post-merge issues)
eugene.petrenko@jetbrains.com
parents: 729
diff changeset
22 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.WrongSubrepoUrlException;
745
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
23 import jetbrains.buildServer.dataStructures.MultiMapToList;
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
24 import jetbrains.buildServer.vcs.*;
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
25 import org.jetbrains.annotations.NotNull;
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
26 import org.jetbrains.annotations.Nullable;
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
27
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
28 import java.util.Date;
745
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
29 import java.util.Map;
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
30
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
31 /**
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
32 * Created 30.09.13 13:05
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
33 *
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
34 * @author Eugene Petrenko (eugene.petrenko@jetbrains.com)
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
35 */
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
36 public class MercurialCommitsInfoBuilderSupport implements CommitsInfoBuilder, MercurialServerExtension {
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
37 private final MercurialVcsSupport mySupport;
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
38 private final HgVcsRootFactory myHgVcsRootFactory;
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
39
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
40 public MercurialCommitsInfoBuilderSupport(@NotNull MercurialVcsSupport vcs,
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
41 @NotNull HgVcsRootFactory vcsRootFactory) {
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
42 vcs.addExtension(this);
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
43 mySupport = vcs;
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
44 myHgVcsRootFactory = vcsRootFactory;
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
45 }
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
46
745
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
47 @NotNull
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
48 private static MultiMapToList<String, String> commitToBranchs(@NotNull final Map<String, String> branchToCommit) {
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
49 final MultiMapToList<String, String> map = new MultiMapToList<String, String>();
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
50 for (Map.Entry<String, String> e : branchToCommit.entrySet()) {
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
51 map.add(e.getValue(), e.getKey());
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
52 }
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
53 return map;
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
54 }
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
55
684
7fb8ecf0d35a update CommitsInfoBuilder service API
eugene.petrenko@gmail.com
parents: 676
diff changeset
56 public void collectCommits(@NotNull final VcsRoot root,
7fb8ecf0d35a update CommitsInfoBuilder service API
eugene.petrenko@gmail.com
parents: 676
diff changeset
57 @NotNull final CheckoutRules rules,
7fb8ecf0d35a update CommitsInfoBuilder service API
eugene.petrenko@gmail.com
parents: 676
diff changeset
58 @NotNull final CommitsConsumer consumer) throws VcsException {
662
c3c0ebc63d77 CommitsInfoBuilder command now returns all commits without respect to state parameter (API update will follow)
eugene.petrenko@gmail.com
parents: 655
diff changeset
59
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
60 final HgVcsRoot hgRoot = myHgVcsRootFactory.createHgRoot(root);
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
61 final ServerHgRepo repo = mySupport.createRepo(hgRoot);
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
62 VcsCallable<MultiMapToList<String, String>> cmd = new VcsCallable<MultiMapToList<String, String>>() {
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 745
diff changeset
63 public MultiMapToList<String, String> call() throws VcsException {
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 745
diff changeset
64 return commitToBranchs(mySupport.getCollectChangesPolicy().getHeads(hgRoot));
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 745
diff changeset
65 }
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
66 };
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
67 final MultiMapToList<String, String> heads = mySupport.syncRepository(hgRoot, new SyncSettings<MultiMapToList<String, String>>(cmd));
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
68 repo.logSubstates().call(new CommitsAndMountPointsCommand.Callback() {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
69 private final MercurialCommitsInfoBuilderStates subs = new MercurialCommitsInfoBuilderStates();
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
70
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
71 public void processHGSubFile(@NotNull String fileId, @NotNull String text) {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
72 subs.addSubNode(fileId, text);
690
e6d203e5c6e3 fix commit message and author for commits with no parents
eugene.petrenko@gmail.com
parents: 684
diff changeset
73 }
673
2d566ca0fa65 include user/message in CommitsInfoBuilder
eugene.petrenko@gmail.com
parents: 663
diff changeset
74
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
75 public void processHGSubStateFile(@NotNull String fileId, @NotNull String text) {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
76 subs.addStateNode(fileId, text);
684
7fb8ecf0d35a update CommitsInfoBuilder service API
eugene.petrenko@gmail.com
parents: 676
diff changeset
77 }
7fb8ecf0d35a update CommitsInfoBuilder service API
eugene.petrenko@gmail.com
parents: 676
diff changeset
78
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
79 public void onCommit(@NotNull String commitNum,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
80 @NotNull String commitId,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
81 @NotNull String[] parents,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
82 @NotNull String branch,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
83 @NotNull String[] tags,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
84 @NotNull String author,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
85 @NotNull String message,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
86 @NotNull Date timestamp,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
87 @Nullable String hgsubNodeId,
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
88 @Nullable String hgsubstateNodeId) {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
89
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
90 final CommitDataBean bean = new CommitDataBean(
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
91 HgRepo.shortId(commitId),
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
92 HgRepo.shortId(commitId),
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
93 timestamp
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
94 );
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
95
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
96 for (String parent : parents) {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
97 if (LogCommand.ZERO_PARENT_ID.equals(parent)) continue;
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
98 if (LogCommand.ZERO_PARENT_SHORT_ID.equals(parent)) continue;
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
99 bean.addParentRevision(HgRepo.shortId(parent));
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
100 }
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
101
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
102 for (String tag : tags) {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
103 if ("tip".equals(tag)) continue;
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
104
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
105 bean.addTag(tag);
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
106 }
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
107
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
108 bean.addBranch(branch);
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
109 bean.setCommitAuthor(author);
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
110 bean.setCommitMessage(message);
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
111
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
112 for (SubRepo subRepo : subs.mounts(hgsubNodeId, hgsubstateNodeId).values()) {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
113 try {
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
114 bean.addMountPoint(new CommitMountPointDataBean(
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
115 subRepo.vcsType().getVcsPluginName(),
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
116 subRepo.resolveUrl(hgRoot.getRepository()),
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
117 subRepo.path(),
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
118 subRepo.revision()
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
119 ));
731
5becb1dfecbd make it compile (post-merge issues)
eugene.petrenko@jetbrains.com
parents: 729
diff changeset
120 } catch (WrongSubrepoUrlException e) {
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
121 //NOP
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
122 }
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
123 }
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
124
745
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
125 bean.setHeads(heads.getValues(bean.getVersion()));
ea5b0ed87e18 report commit heads
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
126
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
127 consumer.consumeCommit(bean);
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
128 }
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
129 });
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
130 }
729
785ab04c78da implement new graph construction code
eugene.petrenko@jetbrains.com
parents: 690
diff changeset
131
655
5a40adf2ca9e implement CommitsInfoBuilder API
eugene.petrenko@gmail.com
parents:
diff changeset
132 }