annotate mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/CheckoutRepository.java @ 977:38adef4f1b8f Indore-2017.2.x

Update copyright
author pavel.sher
date Mon, 22 Jan 2018 11:40:45 +0100
parents a6405f5aad54
children f342d25311c1
rev   line source
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
1 /*
977
38adef4f1b8f Update copyright
pavel.sher
parents: 872
diff changeset
2 * Copyright 2000-2018 JetBrains s.r.o.
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
3 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
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: 697
diff changeset
6 * You may obtain a copy of the License at
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
7 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
9 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
10 * Unless required by applicable law or agreed to in writing, software
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
11 * distributed under the License is distributed on an "AS IS" BASIS,
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
13 * See the License for the specific language governing permissions and
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
14 * limitations under the License.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
15 */
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
16
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
17 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
18
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
19 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.HgVcsRoot;
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
20 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.WrongSubrepoUrlException;
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
21 import jetbrains.buildServer.vcs.VcsException;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
22 import org.jetbrains.annotations.NotNull;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
23 import org.jetbrains.annotations.Nullable;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
24
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
25 import java.io.File;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
26 import java.io.IOException;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
27 import java.util.Map;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
28
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
29 import static jetbrains.buildServer.util.FileUtil.delete;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
30
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
31 /**
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
32 * Repository checkout which uses mirrors (updates them first)
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
33 * and supports subrepos.
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
34 */
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
35 public class CheckoutRepository {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
36
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
37 private final MirrorManager myMirrorManager;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
38 private final HgRepoFactory myHgRepoFactory;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
39 private final int myPullTimeout;
649
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
40 private boolean myGlobalTagsAsBranches;
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
41 private final HgVcsRoot myRoot;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
42 private final File myWorkingDir;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
43 private String myRevision;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
44 private String myBranch;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
45
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
46 CheckoutRepository(@NotNull MirrorManager mirrorManager,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
47 @NotNull HgRepoFactory hgRepoFactory,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
48 int pullTimeout,
649
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
49 boolean globalTagsAsBranches,
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
50 @NotNull HgVcsRoot root,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
51 @NotNull File workingDir) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
52 myMirrorManager = mirrorManager;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
53 myHgRepoFactory = hgRepoFactory;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
54 myPullTimeout = pullTimeout;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
55 myRoot = root;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
56 myWorkingDir = workingDir;
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
57 myGlobalTagsAsBranches = globalTagsAsBranches;
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
58 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
59
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
60 public CheckoutRepository setRevision(String revision) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
61 myRevision = revision;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
62 return this;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
63 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
64
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
65 public CheckoutRepository setBranch(String branch) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
66 myBranch = branch;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
67 return this;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
68 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
69
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
70 public void checkout() throws VcsException {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
71 checkout(myRoot, myWorkingDir, myRevision);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
72 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
73
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
74 private void checkout(@NotNull HgVcsRoot root,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
75 @NotNull File workingDir,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
76 @Nullable String revision) throws VcsException {
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
77 revision = updateRepository(root, workingDir, revision);
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
78 if (revision == null)
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
79 return;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
80 updateSubrepos(root, workingDir, revision);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
81 updateWorkingDir(root, workingDir, revision);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
82 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
83
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
84
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
85 @Nullable
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
86 private String updateRepository(@NotNull HgVcsRoot root,
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
87 @NotNull File workingDir,
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
88 @Nullable String revision) throws VcsException {
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
89 HgRepo repo = myHgRepoFactory.createRepo(root, workingDir);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
90 if (revision != null && repo.containsRevision(revision))
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
91 return revision;
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
92
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
93 String rev = updateMirror(root, revision);
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
94 String mirrorUrl = getMirrorUrl(root);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
95
872
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
96 if (!repo.isValidRepository())
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
97 repo.init().call();
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
98 repo.pull().fromRepository(mirrorUrl)
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
99 .withTimeout(myPullTimeout)
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
100 .call();
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
101 repo.setDefaultPath(root.getRepository());
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
102 repo.setTeamCityConfig(root.getCustomHgConfig());
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
103 return rev;
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
104 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
105
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
106
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
107 private void updateWorkingDir(@NotNull HgVcsRoot root,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
108 @NotNull File workingDir,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
109 @NotNull String revision) throws VcsException {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
110 HgRepo repo = myHgRepoFactory.createRepo(root, workingDir);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
111 repo.update().toRevision(revision).call();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
112 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
113
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
114
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
115 private void updateSubrepos(@NotNull HgVcsRoot root,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
116 @NotNull File workingDir,
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
117 @Nullable String revision) throws VcsException {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
118 HgRepo repo = myHgRepoFactory.createRepo(root, workingDir);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
119 if (!repo.hasSubreposAtRevision(revision))
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
120 return;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
121
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
122 String workingDirRevision = repo.getWorkingDirRevision();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
123 Map<String, SubRepo> workingDirSubrepos = repo.getSubrepositories(workingDirRevision);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
124 Map<String, SubRepo> subrepos = repo.getSubrepositories(revision);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
125 for (Map.Entry<String, SubRepo> entry : subrepos.entrySet()) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
126 String path = entry.getKey();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
127 SubRepo subrepoConfig = entry.getValue();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
128 SubRepo workingDirSubrepo = workingDirSubrepos.get(path);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
129 if (workingDirSubrepo != null && subrepoConfig.hasDifferentUrlThan(workingDirSubrepo))
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
130 delete(subrepoConfigDir(repo, subrepoConfig));
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
131
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
132 File subrepoDir = new File(workingDir, subrepoConfig.path());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
133 String subrepoUrl;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
134 try {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
135 subrepoUrl = subrepoConfig.resolveUrl(root.getRepository());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
136 if (subrepoConfig.vcsType() == SubRepo.VcsType.hg && !isRelativeUrl(subrepoUrl)) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
137 HgVcsRoot subrepoRoot = root.withUrl(subrepoUrl);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
138 updateRepository(subrepoRoot, subrepoDir, subrepoConfig.revision());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
139 }
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
140 } catch (WrongSubrepoUrlException e) {
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
141 subrepoUrl = subrepoConfig.url();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
142 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
143
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
144 updateSubrepos(root.withUrl(subrepoUrl), subrepoDir, subrepoConfig.revision());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
145 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
146 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
147
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
148
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
149 private boolean isRelativeUrl(@NotNull String url) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
150 return url.startsWith(".");
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
151 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
152
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
153
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
154 private File subrepoConfigDir(@NotNull HgRepo parentRepo, @NotNull SubRepo subrepo) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
155 return new File(parentRepo.getWorkingDir(), subrepo.path());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
156 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
157
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
158
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
159 /**
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
160 * @return the given revision if it was not null, or revision of the myBranch if myBranch != null,
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
161 * otherwise returns null. Need to resolve a branch revision with mirror lock because bookmarks
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
162 * can be deleted by another thread.
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
163 */
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
164 @Nullable
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
165 private String updateMirror(@NotNull HgVcsRoot root, @Nullable String revision) throws VcsException {
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
166 String url = root.getRepository();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
167 File mirrorDir = myMirrorManager.getMirrorDir(url);
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
168 myMirrorManager.lockDir(mirrorDir);
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
169 try {
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
170 HgRepo repo = myHgRepoFactory.createRepo(root, mirrorDir);
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
171 if (revision != null && repo.containsRevision(revision)) {
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
172 return revision;
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
173 }
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
174
872
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
175 if (!repo.isValidRepository())
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
176 repo.init().call();
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
177
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
178 repo.pull().fromRepository(root.getRepository())
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
179 .withTimeout(myPullTimeout)
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
180 .call();
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
181 repo.setDefaultPath(root.getRepository());
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 783
diff changeset
182 repo.setTeamCityConfig(root.getCustomHgConfig());
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
183
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
184 if (revision != null)
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
185 return revision;
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
186 if (myBranch == null)
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
187 return null;
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
188 boolean includeTags = myGlobalTagsAsBranches && root.useTagsAsBranches();
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
189 return repo.getBranchRevisions(true, includeTags).get(myBranch);
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
190 } finally {
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 732
diff changeset
191 myMirrorManager.unlockDir(mirrorDir);
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
192 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
193 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
194
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
195 private String getMirrorUrl(@NotNull HgVcsRoot root) throws VcsException {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
196 try {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
197 return myMirrorManager.getMirrorDir(root.getRepository()).getCanonicalPath();
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
198 } catch (IOException e) {
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
199 throw new VcsException(e);
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
200 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
201 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
202 }