annotate mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java @ 280:8c1fd2e565ae

Implement mercurial detection on the agents When agent starts, hg-plugin detects installed hg (searches it in the $PATH). If plugin is able to run hg and hg has an approrpiate version (1.5.2+), then plugin reports path to hg in the 'teamcity.hg.agent.path' parameter. This parameter can be used in the "HG command path" field in a VCS root settings, configurations with such root will be run only on agents which report path to hg. Also user can set this parameter manually in the buildAgent.properties. A server side of plugin first checks value of internal property 'teamcity.hg.server.path' and if property is set, its value is used. Second, plugin tries to use path from the settings of VCS root: if path is equal to '%teamcity.hg.agent.path%' - use 'hg' as path, otherwise use a value from the root. With such order old setups, where path in the VCS root was used on both server and agent, will continue to work. New VCS roots with references in the path will also work if hg is in the $PATH on the server or internal property is set.
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Fri, 19 Aug 2011 15:21:38 +0400
parents f80e17ac2da6
children e9cdb499350d
rev   line source
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
1 /*
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
2 * Copyright 2000-2011 JetBrains s.r.o.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
3 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
5 * you may not use this file except in compliance with the License.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
6 * You may obtain a copy of the License at
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
7 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
9 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
10 * Unless required by applicable law or agreed to in writing, software
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
11 * distributed under the License is distributed on an "AS IS" BASIS,
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
13 * See the License for the specific language governing permissions and
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
14 * limitations under the License.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
15 */
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
16 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
17
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
18 import jetbrains.buildServer.agent.AgentRunningBuild;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
19 import jetbrains.buildServer.agent.BuildAgentConfiguration;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
20 import jetbrains.buildServer.agent.BuildProgressLogger;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
21 import jetbrains.buildServer.agent.vcs.AgentVcsSupport;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
22 import jetbrains.buildServer.agent.vcs.IncludeRuleUpdater;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
23 import jetbrains.buildServer.agent.vcs.UpdateByIncludeRules2;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
24 import jetbrains.buildServer.agent.vcs.UpdatePolicy;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
25 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
26 import jetbrains.buildServer.util.FileUtil;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
27 import jetbrains.buildServer.vcs.CheckoutRules;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
28 import jetbrains.buildServer.vcs.IncludeRule;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
29 import jetbrains.buildServer.vcs.VcsException;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
30 import jetbrains.buildServer.vcs.VcsRoot;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
31 import org.jetbrains.annotations.NotNull;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
32
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
33 import java.io.File;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
34 import java.io.IOException;
277
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
35 import java.util.Collections;
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
36
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
37 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.command.CommandUtil.removePrivateData;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
38
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
39 public class MercurialAgentSideVcsSupport extends AgentVcsSupport implements UpdateByIncludeRules2 {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
40
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
41 private final MirrorManager myMirrorManager;
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 277
diff changeset
42 private final HgPathProvider myHgPathProvider;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
43
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 277
diff changeset
44 public MercurialAgentSideVcsSupport(@NotNull final BuildAgentConfiguration agentConfiguration,
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 277
diff changeset
45 @NotNull final HgPathProvider hgPathProvider) {
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
46 myMirrorManager = new MirrorManager(agentConfiguration.getCacheDirectory("mercurial"));
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 277
diff changeset
47 myHgPathProvider = hgPathProvider;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
48 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
49
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
50 public IncludeRuleUpdater getUpdater(@NotNull final VcsRoot vcsRoot, @NotNull final CheckoutRules checkoutRules, @NotNull final String toVersion, @NotNull final File checkoutDirectory, @NotNull final AgentRunningBuild build, boolean cleanCheckoutRequested) throws VcsException {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
51 final BuildProgressLogger logger = build.getBuildLogger();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
52 final boolean useLocalMirrors = isUseLocalMirrors(build);
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 277
diff changeset
53
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
54 return new IncludeRuleUpdater() {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
55 public void process(@NotNull final IncludeRule includeRule, @NotNull final File workingDir) throws VcsException {
272
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
56 try {
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
57 checkRuleIsValid(includeRule);
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 277
diff changeset
58 Settings settings = new Settings(myHgPathProvider, vcsRoot);
272
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
59 if (useLocalMirrors) {
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
60 updateLocalMirror(vcsRoot, logger);
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
61 }
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
62 updateRepository(workingDir, settings, logger, useLocalMirrors);
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
63 updateWorkingDir(settings, workingDir, toVersion, logger);
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
64 } catch (Exception e) {
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
65 if (e instanceof VcsException)
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
66 throw (VcsException) e;
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
67 else
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
68 throw new VcsException(e);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
69 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
70 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
71
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
72 public void dispose() throws VcsException {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
73 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
74 };
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
75 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
76
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
77 @NotNull
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
78 @Override
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
79 public String getName() {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
80 return Constants.VCS_NAME;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
81 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
82
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
83 @NotNull
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
84 @Override
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
85 public UpdatePolicy getUpdatePolicy() {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
86 return this;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
87 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
88
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
89 private boolean isUseLocalMirrors(AgentRunningBuild build) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
90 String value = build.getSharedConfigParameters().get("teamcity.hg.use.local.mirrors");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
91 return "true".equals(value);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
92 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
93
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
94 private void initRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
95 try {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
96 String defaultPullUrl = getDefaultPullUrl(settings, useLocalMirrors);
277
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
97 logger.message("Init repository at " + workingDir.getAbsolutePath() + ", remote repository is " +
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
98 removePrivateData(defaultPullUrl, Collections.singleton(settings.getPassword())));
271
c0540bbe7c2a Revert premature commit. Parents are not part of API yet
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 268
diff changeset
99 new Init(settings, workingDir, defaultPullUrl).execute();
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
100 } catch (IOException e) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
101 throw new VcsException("Error while initializing repository at " + workingDir.getAbsolutePath(), e);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
102 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
103 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
104
272
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
105 private void updateRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException, IOException {
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
106 if (!Settings.isValidRepository(workingDir)) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
107 initRepository(workingDir, settings, logger, useLocalMirrors);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
108 } else {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
109 ensureUseRightRepository(workingDir, settings, logger, useLocalMirrors);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
110 }
277
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
111 String defaultPullUrl = getDefaultPullUrl(settings, useLocalMirrors);
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
112 logger.message("Start pulling changes from " + removePrivateData(defaultPullUrl, Collections.singleton(settings.getPassword())));
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
113 new PullCommand(settings, workingDir).execute();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
114 logger.message("Changes successfully pulled");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
115 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
116
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
117 private void ensureUseRightRepository(File workingDir, Settings settings, BuildProgressLogger logger, boolean useLocalMirrors) throws VcsException {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
118 boolean clonedFromWrongRepository = useLocalMirrors && !isClonedFromLocalMirror(settings, workingDir)
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
119 || !useLocalMirrors && isClonedFromLocalMirror(settings, workingDir);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
120
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
121 if (clonedFromWrongRepository) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
122 String rightRepository = useLocalMirrors ? "local mirror" : "remote repository";
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
123 String wrongRepository = useLocalMirrors ? "remote repository" : "local mirror";
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
124 logger.message("Repository in working directory is cloned from " + wrongRepository + ", clone it from " + rightRepository);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
125 FileUtil.delete(workingDir);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
126 initRepository(workingDir, settings, logger, useLocalMirrors);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
127 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
128 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
129
272
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
130 private void updateLocalMirror(VcsRoot root, BuildProgressLogger logger) throws VcsException, IOException {
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 277
diff changeset
131 Settings settings = new Settings(myHgPathProvider, root);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
132 File mirrorDir = myMirrorManager.getMirrorDir(settings.getRepositoryUrl());
272
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
133 logger.message("Update local mirror at " + mirrorDir);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
134 if (!Settings.isValidRepository(mirrorDir)) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
135 initRepository(mirrorDir, settings, logger, false);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
136 }
277
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
137 final String defaultPullUrl = getDefaultPullUrl(settings, true);
f80e17ac2da6 Remove private data from the logs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 272
diff changeset
138 logger.message("Start pulling changes from " + removePrivateData(defaultPullUrl, Collections.singleton(settings.getPassword())));
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
139 new PullCommand(settings, mirrorDir).execute();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
140 logger.message("Local mirror changes successfully pulled");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
141 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
142
272
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
143 private void updateWorkingDir(final Settings settings, File workingDir, @NotNull final String version, final BuildProgressLogger logger) throws VcsException {
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
144 logger.message("Updating folder " + workingDir.getAbsolutePath() + " to revision " + version);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
145 UpdateCommand uc = new UpdateCommand(settings, workingDir);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
146 ChangeSet cs = new ChangeSet(version);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
147 uc.setToId(cs.getId());
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
148 uc.execute();
272
5fd8b9e79e5b Improve logging
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 271
diff changeset
149 logger.message("Folder successfully updated");
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
150 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
151
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
152 private String getDefaultPullUrl(Settings settings, boolean useLocalMirror) throws IOException {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
153 if (useLocalMirror) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
154 File mirrorDir = myMirrorManager.getMirrorDir(settings.getRepositoryUrl());
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
155 return mirrorDir.getCanonicalPath();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
156 } else {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
157 return settings.getRepositoryUrl();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
158 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
159 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
160
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
161 private void checkRuleIsValid(IncludeRule includeRule) throws VcsException {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
162 if (includeRule.getTo() != null && includeRule.getTo().length() > 0) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
163 if (!".".equals(includeRule.getFrom()) && includeRule.getFrom().length() != 0) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
164 throw new VcsException("Invalid include rule: " + includeRule.toString() + ", Mercurial plugin supports mapping of the form: +:.=>dir only.");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
165 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
166 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
167 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
168
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
169 public boolean isClonedFromLocalMirror(Settings settings, File workingDir) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
170 try {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
171 File mirrorDir = myMirrorManager.getMirrorDir(settings.getRepositoryUrl());
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
172 File hgrc = new File(workingDir, ".hg" + File.separator + "hgrc");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
173 String config = FileUtil.readText(hgrc);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
174 return config.contains("default = " + mirrorDir.getCanonicalPath());
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
175 } catch (Exception e) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
176 return false;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
177 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
178 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 213
diff changeset
179 }