annotate mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java @ 876:b2816067699a

Report lock acquisition progress
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Wed, 01 Oct 2014 22:03:19 +0200
parents 95e7d2ff8945
children 45311425ee3c
rev   line source
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
1 /*
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 697
diff changeset
2 * Copyright 2000-2014 JetBrains s.r.o.
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
3 *
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
5 * you may not use this file except in compliance with the License.
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
6 * You may obtain a copy of the License at
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
7 *
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
9 *
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
10 * Unless required by applicable law or agreed to in writing, software
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
11 * distributed under the License is distributed on an "AS IS" BASIS,
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
13 * See the License for the specific language governing permissions and
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
14 * limitations under the License.
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
15 */
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
16 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
17
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
18 import jetbrains.buildServer.Used;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
19 import jetbrains.buildServer.buildTriggers.vcs.AbstractVcsPropertiesProcessor;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
20 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
627
eadc7e5c2236 TW-28975, TW-30345 re-clone repository in case of "abandoned transaction" error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 605
diff changeset
21 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.AbandonedTransactionFound;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
22 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.UnrelatedRepositoryException;
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 696
diff changeset
23 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.exception.WrongSubrepoUrlException;
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
24 import jetbrains.buildServer.log.Loggers;
652
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
25 import jetbrains.buildServer.serverSide.InvalidProperty;
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
26 import jetbrains.buildServer.serverSide.PropertiesProcessor;
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
27 import jetbrains.buildServer.serverSide.ServerListener;
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
28 import jetbrains.buildServer.serverSide.ServerListenerAdapter;
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
29 import jetbrains.buildServer.util.EventDispatcher;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
30 import jetbrains.buildServer.util.FileUtil;
372
2869f49b9211 TW-17252 handle mercurial caches correctly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 371
diff changeset
31 import jetbrains.buildServer.util.cache.ResetCacheRegister;
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
32 import jetbrains.buildServer.vcs.*;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
33 import jetbrains.buildServer.vcs.patches.PatchBuilder;
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
34 import org.apache.commons.compress.archivers.ArchiveEntry;
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
35 import org.apache.commons.compress.archivers.ArchiveInputStream;
688
5f3b5d95504e Get rid of ArchiveUtil
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 686
diff changeset
36 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
37 import org.jetbrains.annotations.NotNull;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
38 import org.jetbrains.annotations.Nullable;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
39
809
44f0842ea5b1 use BufferedInputStream
eugene.petrenko@jetbrains.com
parents: 808
diff changeset
40 import java.io.*;
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
41 import java.util.*;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
42
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
43 import static com.intellij.openapi.util.text.StringUtil.isEmpty;
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
44 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil.deleteDir;
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
45
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
46 /**
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
47 * Mercurial VCS plugin for TeamCity works as follows:
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
48 * <ul>
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
49 * <li>clones repository to internal storage
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
50 * <li>before any operation with working copy of repository pulls changes from the original repository
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
51 * <li>executes corresponding hg command
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
52 * </ul>
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
53 *
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
54 * <p>Working copy of repository is created in the $TEAMCITY_DATA_PATH/system/caches/hg_&lt;hash code> folder.
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
55 * <p>Personal builds (remote runs) are not yet supported, they require corresponding functionality from the IDE.
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
56 */
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 566
diff changeset
57 public class MercurialVcsSupport extends ServerVcsSupport implements LabelingSupport, VcsFileContentProvider, BuildPatchByCheckoutRules {
873
95e7d2ff8945 Run hg pull with progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 872
diff changeset
58 private final VcsOperationProgressProvider myProgressProvider;
355
69d66e4f60e3 Extract MirrorManager interface
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 352
diff changeset
59 private final MirrorManager myMirrorManager;
329
ef091b782acc Add ability to specify timeout for pull operation (teamcity.hg.pull.timeout.seconds)
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 289
diff changeset
60 private final ServerPluginConfig myConfig;
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
61 private final HgPathProvider myHgPathProvider;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
62 private final RepoFactory myRepoFactory;
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
63 private final HgVcsRootFactory myHgVcsRootFactory;
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
64 private final FileFilter myIgnoreDotHgFilter = new IgnoreDotHgFilter();
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
65 private final FileFilter myAcceptAllFilter = new AcceptAllFilter();
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
66 private final HgTestConnectionSupport myTestConnection;
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
67 private final SubrepoCheckoutRulesProvider mySubrepoCheckoutRulesProvider;
631
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
68 private final Collection<MercurialServerExtension> myExtensions = new ArrayList<MercurialServerExtension>();
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
69
873
95e7d2ff8945 Run hg pull with progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 872
diff changeset
70 public MercurialVcsSupport(@NotNull final VcsOperationProgressProvider progressProvider,
95e7d2ff8945 Run hg pull with progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 872
diff changeset
71 @NotNull final EventDispatcher<ServerListener> dispatcher,
372
2869f49b9211 TW-17252 handle mercurial caches correctly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 371
diff changeset
72 @NotNull final ResetCacheRegister resetCacheHandlerManager,
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
73 @NotNull final ServerPluginConfig config,
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
74 @NotNull final HgPathProvider hgPathProvider,
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
75 @NotNull final RepoFactory repoFactory,
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
76 @NotNull final MirrorManager mirrorManager,
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
77 @NotNull final HgVcsRootFactory hgVcsRootFactory,
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
78 @NotNull final HgTestConnectionSupport testConnection,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
79 @NotNull final SubrepoCheckoutRulesProvider subrepoCheckoutRulesProvider) {
873
95e7d2ff8945 Run hg pull with progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 872
diff changeset
80 myProgressProvider = progressProvider;
256
73708ca4521f Add ability to disable pull protocol
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 252
diff changeset
81 myConfig = config;
356
53b430731041 TW-19984 ensure map file cleaned as well
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 355
diff changeset
82 myMirrorManager = mirrorManager;
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
83 myHgPathProvider = hgPathProvider;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
84 myRepoFactory = repoFactory;
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
85 myHgVcsRootFactory = hgVcsRootFactory;
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
86 myTestConnection = testConnection;
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
87 mySubrepoCheckoutRulesProvider = subrepoCheckoutRulesProvider;
372
2869f49b9211 TW-17252 handle mercurial caches correctly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 371
diff changeset
88 resetCacheHandlerManager.registerHandler(new MercurialResetCacheHandler(myMirrorManager));
514
89e9c06fbc76 Move TeamCity-specific logic to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 511
diff changeset
89 dispatcher.addListener(new ServerListenerAdapter() {
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
90 @Override
408
b34ffc622efc TW-20295 store log.template in the temp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 404
diff changeset
91 public void serverShutdown() {
b34ffc622efc TW-20295 store log.template in the temp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 404
diff changeset
92 myRepoFactory.dispose();
b34ffc622efc TW-20295 store log.template in the temp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 404
diff changeset
93 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
94 });
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
95 logUsedHg();
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
96 }
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
97
631
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
98 public void addExtensions(@NotNull Collection<MercurialServerExtension> extensions) {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
99 myExtensions.addAll(extensions);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
100 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
101
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
102 public void addExtension(@NotNull MercurialServerExtension extension) {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
103 myExtensions.add(extension);
514
89e9c06fbc76 Move TeamCity-specific logic to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 511
diff changeset
104 }
89e9c06fbc76 Move TeamCity-specific logic to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 511
diff changeset
105
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
106 private void logUsedHg() {
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
107 String hgPath = myConfig.getHgPath();
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
108 if (hgPath != null)
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
109 Loggers.VCS.info("Use server-wide hg path " + hgPath + ", path in the VCS root settings will be ignored");
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
110 else
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
111 Loggers.VCS.info("Server-wide hg path is not set, will use path from the VCS root settings");
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
112 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
113
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
114 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
115 public byte[] getContent(@NotNull final VcsModification vcsModification,
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
116 @NotNull final VcsChangeInfo change,
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
117 @NotNull final VcsChangeInfo.ContentType contentType,
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
118 @NotNull final VcsRoot vcsRoot) throws VcsException {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
119 String version = contentType == VcsChangeInfo.ContentType.AFTER_CHANGE ? change.getAfterChangeRevisionNumber() : change.getBeforeChangeRevisionNumber();
572
6e5934c81b66 fix getContent for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 567
diff changeset
120 return getContent(change.getFileName(), vcsRoot, version);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
121 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
122
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
123 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
124 public byte[] getContent(@NotNull final String filePath, @NotNull final VcsRoot vcsRoot, @NotNull final String version) throws VcsException {
225
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
125 ChangeSet cset = new ChangeSet(version);
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
126 HgVcsRoot root = getHgRoot(vcsRoot);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
127 syncRepository(root, cset);
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
128 HgRepo repo = createRepo(root);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
129 File parentDir = repo.cat().files(filePath).atRevision(cset).call();
397
36b1bc5add89 Method getContent() should throw exception for non-existing files
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
130 File file = new File(parentDir, filePath);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
131 try {
397
36b1bc5add89 Method getContent() should throw exception for non-existing files
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
132 return FileUtil.loadFileBytes(file);
36b1bc5add89 Method getContent() should throw exception for non-existing files
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
133 } catch (IOException e) {
36b1bc5add89 Method getContent() should throw exception for non-existing files
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
134 throw new VcsException("Failed to load content of file " + filePath + " at revision " + version, e);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
135 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
136 deleteDir(parentDir, Loggers.VCS);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
137 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
138 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
139
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
140 @NotNull
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
141 public HgVcsRoot getHgRoot(@NotNull final VcsRoot vcsRoot) throws VcsException {
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
142 return myHgVcsRootFactory.createHgRoot(vcsRoot);
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
143 }
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
144
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
145 @NotNull
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
146 public String getName() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
147 return Constants.VCS_NAME;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
148 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
149
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
150 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
151 @Used("jsp")
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
152 public String getDisplayName() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
153 return "Mercurial";
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
154 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
155
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
156 @Nullable
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
157 public PropertiesProcessor getVcsPropertiesProcessor() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
158 return new AbstractVcsPropertiesProcessor() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
159 public Collection<InvalidProperty> process(final Map<String, String> properties) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
160 List<InvalidProperty> result = new ArrayList<InvalidProperty>();
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
161 if (isEmpty(properties.get(Constants.HG_COMMAND_PATH_PROP))) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
162 result.add(new InvalidProperty(Constants.HG_COMMAND_PATH_PROP, "Path to 'hg' command must be specified"));
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
163 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
164 if (isEmpty(properties.get(Constants.REPOSITORY_PROP))) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
165 result.add(new InvalidProperty(Constants.REPOSITORY_PROP, "Repository must be specified"));
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
166 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
167 return result;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
168 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
169 };
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
170 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
171
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
172 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
173 public String getVcsSettingsJspFilePath() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
174 return "mercurialSettings.jsp";
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
175 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
176
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
177 public boolean sourcesUpdatePossibleIfChangesNotFound(@NotNull final VcsRoot root) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
178 return false;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
179 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
180
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
181 @NotNull
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
182 public String describeVcsRoot(@NotNull final VcsRoot vcsRoot) {
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
183 return "mercurial: " + vcsRoot.getProperty(Constants.REPOSITORY_PROP);
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
184 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
185
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
186 @Override
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
187 @NotNull
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
188 public TestConnectionSupport getTestConnectionSupport() {
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
189 return myTestConnection;
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
190 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
191
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
192 @Nullable
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
193 public Map<String, String> getDefaultVcsProperties() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
194 Map<String, String> defaults = new HashMap<String, String>();
501
a3dc94c399d4 Add a default branch name
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
195 defaults.put(Constants.BRANCH_NAME_PROP, "default");
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
196 defaults.put(Constants.HG_COMMAND_PATH_PROP, "hg");
502
2755266b7dd5 Use uncompressed transfer explicitly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 501
diff changeset
197 defaults.put(Constants.UNCOMPRESSED_TRANSFER, "true");
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
198 return defaults;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
199 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
200
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
201 public String getVersionDisplayName(@NotNull final String version, @NotNull final VcsRoot root) throws VcsException {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
202 return new ChangeSet(version).getId();
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
203 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
204
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
205 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
206 public Comparator<String> getVersionComparator() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
207 // comparator is called when TeamCity needs to sort modifications in the order of their appearance,
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
208 // currently we sort changes by revision number, not sure however that this is a good idea,
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
209 // probably it would be better to sort them by timestamp (and to add timestamp into the version).
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
210 return new Comparator<String>() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
211 public int compare(final String o1, final String o2) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
212 try {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
213 return new ChangeSet(o1).getRevNumber() - new ChangeSet(o2).getRevNumber();
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
214 } catch (Exception e) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
215 return 1;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
216 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
217 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
218 };
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
219 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
220
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
221 // builds patch from version to version
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
222 private void buildIncrementalPatch(@NotNull final HgVcsRoot root,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
223 @NotNull final ChangeSet fromVer,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
224 @NotNull final ChangeSet toVer,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
225 @NotNull final PatchBuilder builder,
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
226 @NotNull final CheckoutRules checkoutRules) throws VcsException, IOException {
808
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
227 final HgRepo repo = createRepo(root);
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
228 final List<FileStatus> modifiedFiles = repo.status().fromRevision(fromVer).toRevision(toVer).call();
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
229 final List<String> notDeletedFiles = new ArrayList<String>();
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
230 for (FileStatus f: modifiedFiles) {
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
231 if (f.getStatus() != Status.REMOVED) {
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
232 notDeletedFiles.add(f.getPath());
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
233 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
234 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
235
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
236 File parentDir = null;
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
237 try {
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
238 if (root.useArchiveForPatch()) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
239 parentDir = HgFileUtil.createTempDir();
808
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
240 final File archFile = new File(parentDir, "arch.tar");
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
241 buildIncrementalPatchWithArchive(builder, repo, toVer, checkoutRules, modifiedFiles, notDeletedFiles, archFile);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
242 } else {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
243 parentDir = repo.cat().files(notDeletedFiles).atRevision(toVer).call();
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
244 for (FileStatus f: modifiedFiles) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
245 String mappedPath = checkoutRules.map(f.getPath());
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
246 if (mappedPath == null) continue; // skip
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
247 final File virtualFile = new File(mappedPath);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
248 if (f.getStatus() == Status.REMOVED) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
249 builder.deleteFile(virtualFile, true);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
250 } else {
808
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
251 final File realFile = new File(parentDir, f.getPath());
809
44f0842ea5b1 use BufferedInputStream
eugene.petrenko@jetbrains.com
parents: 808
diff changeset
252 final InputStream is = new BufferedInputStream(new FileInputStream(realFile));
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
253 try {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
254 builder.changeOrCreateBinaryFile(virtualFile, null, is, realFile.length());
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
255 } finally {
809
44f0842ea5b1 use BufferedInputStream
eugene.petrenko@jetbrains.com
parents: 808
diff changeset
256 FileUtil.close(is);
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
257 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
258 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
259 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
260 }
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
261 if (root.includeSubreposInPatch())
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
262 buildSubrepoPatch(root, fromVer, toVer, builder, checkoutRules, repo);
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
263 } catch (Exception e) {
850
67753eb68a09 Don't build a clean patch if incremental patch fails
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 794
diff changeset
264 if (e instanceof VcsException)
67753eb68a09 Don't build a clean patch if incremental patch fails
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 794
diff changeset
265 throw (VcsException) e;
67753eb68a09 Don't build a clean patch if incremental patch fails
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 794
diff changeset
266 throw new VcsException("Error while building an incremental patch", e);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
267 } finally {
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
268 if (parentDir != null)
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
269 deleteDir(parentDir, Loggers.VCS);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
270 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
271 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
272
805
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
273 private void buildIncrementalPatchWithArchive(@NotNull final PatchBuilder builder,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
274 @NotNull final HgRepo repo,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
275 @NotNull final ChangeSet toVer,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
276 @NotNull final CheckoutRules checkoutRules,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
277 @NotNull final List<FileStatus> modifiedFiles,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
278 @NotNull final List<String> notDeletedFiles,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
279 @NotNull final File archiveFile) throws VcsException, IOException {
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
280 ArchiveCommand archive = repo.archive().revision(toVer).type("tar").destination(archiveFile);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
281 int i = 0;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
282 while (i < notDeletedFiles.size()) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
283 String mappedPath = checkoutRules.map(notDeletedFiles.get(i));
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
284 if (mappedPath == null) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
285 i++;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
286 continue;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
287 }
862
24a6ef9166ae UP-1866 disable patterns in hg archive include rules
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 853
diff changeset
288 if (archive.addIncludePathRule(/*"path:" + */notDeletedFiles.get(i))) {
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
289 i++;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
290 continue;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
291 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
292 //archive command is full, call it
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
293 archive.call();
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
294 buildPatchFromArchive(builder, archiveFile, checkoutRules, new ExcludeHgArchival());
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
295 FileUtil.delete(archiveFile);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
296 archive = repo.archive().revision(toVer).type("tar").destination(archiveFile);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
297 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
298 if (!notDeletedFiles.isEmpty()) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
299 archive.call();
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
300 buildPatchFromArchive(builder, archiveFile, checkoutRules, new ExcludeHgArchival());
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
301 FileUtil.delete(archiveFile);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
302 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
303
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
304 //delete removed files
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
305 for (FileStatus f: modifiedFiles) {
813
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
306 if (f.getStatus() != Status.REMOVED) continue; //other files processed below
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
307
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
308 final String mappedPath = checkoutRules.map(f.getPath());
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
309 if (mappedPath == null) continue; // skip
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
310
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
311 builder.deleteFile(new File(mappedPath), true);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
312 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
313 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
314
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
315
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
316 private void buildSubrepoPatch(@NotNull HgVcsRoot mainRoot,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
317 @NotNull ChangeSet mainRootFromRevision,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
318 @NotNull ChangeSet mainRootToRevision,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
319 @NotNull PatchBuilder builder,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
320 @NotNull CheckoutRules mainRootRules,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
321 @NotNull HgRepo mainRepo) throws IOException, VcsException {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
322 List<HgSubrepoConfigChange> subrepoConfigChanges = mainRepo.getSubrepoConfigChanges(mainRootFromRevision.getId(), mainRootToRevision.getId());
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
323 for (HgSubrepoConfigChange configChange : subrepoConfigChanges) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
324 try {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
325 String subrepoPath = configChange.getPath();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
326 if (!mainRootRules.shouldInclude(subrepoPath))
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
327 continue;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
328 SubRepo currentSubrepo = configChange.getCurrent();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
329
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
330 if (configChange.subrepoAdded()) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
331 assert currentSubrepo != null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
332 String subrepoUrl = currentSubrepo.resolveUrl(mainRoot.getRepository());
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
333 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
334 String subrepoFromRevision = null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
335 String subrepoToRevision = currentSubrepo.revision();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
336 CheckoutRules subrepoRules = mySubrepoCheckoutRulesProvider.getSubrepoRules(mainRootRules, subrepoPath);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
337 buildPatch(subrepoRoot, subrepoFromRevision, subrepoToRevision, builder, subrepoRules);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
338
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
339 } else if (configChange.subrepoRemoved()) {
853
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
340 deleteDirInPatch(builder, mainRootRules, subrepoPath);
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
341
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
342 } else if (configChange.subrepoUrlChanged()) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
343 assert currentSubrepo != null;
853
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
344 deleteDirInPatch(builder, mainRootRules, subrepoPath);
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
345
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
346 String subrepoUrl = currentSubrepo.resolveUrl(mainRoot.getRepository());
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
347 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
348 String subrepoFromRevision = null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
349 String subrepoToRevision = currentSubrepo.revision();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
350 CheckoutRules subrepoRules = mySubrepoCheckoutRulesProvider.getSubrepoRules(mainRootRules, subrepoPath);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
351 buildPatch(subrepoRoot, subrepoFromRevision, subrepoToRevision, builder, subrepoRules);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
352
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
353 } else {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
354 assert currentSubrepo != null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
355 String subrepoUrl = currentSubrepo.resolveUrl(mainRoot.getRepository());
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
356 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
357 String subrepoFromRevision = configChange.getPrevious().get(0).revision();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
358 String subrepoToRevision = currentSubrepo.revision();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
359 CheckoutRules subrepoRules = mySubrepoCheckoutRulesProvider.getSubrepoRules(mainRootRules, subrepoPath);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
360 buildPatch(subrepoRoot, subrepoFromRevision, subrepoToRevision, builder, subrepoRules);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
361 }
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 696
diff changeset
362 } catch (WrongSubrepoUrlException e) {
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
363 throw new VcsException("Error while resolving subrepo url", e);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
364 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
365 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
366 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
367
853
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
368 private void deleteDirInPatch(@NotNull PatchBuilder builder, @NotNull CheckoutRules rules, @NotNull String unMappedPath) throws IOException {
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
369 for (IncludeRule rule : rules.getRootIncludeRules()) {
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
370 String mappedPath = rule.map(unMappedPath);
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
371 if (mappedPath != null)
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
372 builder.deleteDirectory(new File(mappedPath), true);
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
373 }
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
374 }
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
375
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
376 // builds patch by exporting files using specified version
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
377 private void buildFullPatch(@NotNull final HgVcsRoot root,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
378 @NotNull final ChangeSet toVer,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
379 @NotNull final PatchBuilder builder,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
380 @NotNull final CheckoutRules checkoutRules) throws IOException, VcsException {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
381 final File tempDir = HgFileUtil.createTempDir();
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
382 try {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
383 final HgRepo repo = createRepo(root);
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
384 if (root.includeSubreposInPatch()) {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
385 final Map<String, SubRepo> subrepos = repo.getSubrepositories(toVer);
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
386 if (!subrepos.isEmpty()) {
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
387 Loggers.VCS.debug("Repository '" + root.getRepository() + "' has subrepos at revision " + toVer.getId() + ", use 'hg clone' to build clean patch");
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
388 final File mirrorDir = getWorkingDir(root);
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
389 final HgRepo cloneOfTheMirror = createRepo(root, tempDir);
872
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 870
diff changeset
390 cloneOfTheMirror.init().call();
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
391 cloneOfTheMirror.setDefaultPath(root.getRepository());
872
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 870
diff changeset
392 cloneOfTheMirror.setTeamCityConfig(root.getCustomHgConfig());
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 870
diff changeset
393 cloneOfTheMirror.pull().fromRepository(mirrorDir).call();
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
394 cloneSubrepos(root, tempDir, subrepos);
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
395 cloneOfTheMirror.update().toRevision(toVer).call();
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
396 buildPatchFromDirectory(builder, tempDir, checkoutRules, myIgnoreDotHgFilter);
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
397 } else {
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
398 Loggers.VCS.debug("Repository '" + root.getRepository() + "' doesn't have subrepos at revision " + toVer.getId() + ", use 'hg archive' to build clean patch");
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
399 if (root.useArchiveForPatch()) {
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
400 File archive = new File(tempDir, "arch.tar");
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
401 repo.archive().revision(toVer).type("tar").destination(archive).call();
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
402 buildPatchFromArchive(builder, archive, checkoutRules, new ExcludeHgArchival());
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
403 } else {
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
404 repo.archive().revision(toVer).destination(tempDir).call();
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
405 buildPatchFromDirectory(builder, tempDir, checkoutRules, myAcceptAllFilter);
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
406 }
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
407 }
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
408 } else {
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
409 Loggers.VCS.debug("Subrepos disabled in VCS root, use 'hg archive' to build clean patch");
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
410 if (root.useArchiveForPatch()) {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
411 final File archive = new File(tempDir, "arch.tar");
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
412 repo.archive().revision(toVer).type("tar").destination(archive).call();
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
413 buildPatchFromArchive(builder, archive, checkoutRules, new ExcludeHgArchival());
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
414 } else {
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
415 repo.archive().revision(toVer).destination(tempDir).call();
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
416 buildPatchFromDirectory(builder, tempDir, checkoutRules, myAcceptAllFilter);
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
417 }
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
418 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
419 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
420 deleteDir(tempDir, Loggers.VCS);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
421 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
422 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
423
586
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
424 private void cloneSubrepos(@NotNull HgVcsRoot mainRoot, @NotNull File mainRootDir, @NotNull Map<String, SubRepo> subrepos) throws VcsException, IOException {
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
425 for (Map.Entry<String, SubRepo> e : subrepos.entrySet()) {
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
426 String path = e.getKey();
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
427 SubRepo subrepoConfig = e.getValue();
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
428 if (subrepoConfig.vcsType() != SubRepo.VcsType.hg)
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
429 continue;
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
430 String parentRepositoryUrl = mainRoot.getRepository();
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
431 try {
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
432 String subrepoUrl = subrepoConfig.resolveUrl(parentRepositoryUrl);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
433 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
434 HgRepo subrepo = createRepo(subrepoRoot);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
435 if (!subrepo.containsRevision(subrepoConfig.revision()))
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
436 syncRepository(subrepoRoot);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
437
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
438 File subrepoMirrorDir = getWorkingDir(subrepoRoot);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
439 File subrepoDir = new File(mainRootDir, path);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
440 HgRepo cloneOfSubrepoMirror = createRepo(subrepoRoot, subrepoDir);
872
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 870
diff changeset
441 cloneOfSubrepoMirror.init().call();
737
ecbca39d0aef Use a resolved subrepo url as a default path
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 732
diff changeset
442 cloneOfSubrepoMirror.setDefaultPath(subrepoUrl);
872
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 870
diff changeset
443 cloneOfSubrepoMirror.setTeamCityConfig(mainRoot.getCustomHgConfig());
a6405f5aad54 TW-19916 more support for custom mercurial config
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 870
diff changeset
444 cloneOfSubrepoMirror.pull().fromRepository(subrepoMirrorDir).call();
586
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
445 Map<String, SubRepo> subSubrepos = subrepo.getSubrepositories(subrepoConfig.revision());
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
446 if (!subSubrepos.isEmpty())
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
447 cloneSubrepos(subrepoRoot, subrepoDir, subSubrepos);
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 696
diff changeset
448 } catch (WrongSubrepoUrlException error) {
586
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
449 //ignore it, will try to clone from network during main repository update
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
450 }
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
451 }
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
452 }
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
453
813
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
454 private void buildPatchFromArchive(@NotNull final PatchBuilder builder,
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
455 @NotNull final File archive,
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
456 @NotNull final CheckoutRules checkoutRules,
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
457 @NotNull final FileFilter filter) throws IOException {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
458 InputStream fis = null;
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
459 ArchiveInputStream is = null;
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
460 try {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
461 fis = new BufferedInputStream(new FileInputStream(archive));
688
5f3b5d95504e Get rid of ArchiveUtil
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 686
diff changeset
462 is = new TarArchiveInputStream(fis);
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
463
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
464 ArchiveEntry entry;
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
465 while ((entry = is.getNextEntry()) != null) {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
466 if (entry.isDirectory()) continue;
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
467
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
468 String fileName = entry.getName();
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
469 //TODO: does it work if I have arch/ in my repo?
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
470 if (fileName.startsWith("arch/")) fileName = fileName.substring(5);
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
471
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
472 if (!filter.accept(new File(fileName))) continue;
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
473
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
474 final String mappedFile = checkoutRules.map(fileName);
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
475 if (!isEmpty(mappedFile)) {
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
476 builder.createBinaryFile(new File(mappedFile), null, is, entry.getSize());
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
477 }
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
478 }
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
479 } finally {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
480 FileUtil.closeAll(is, fis);
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
481 }
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
482 }
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
483
815
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
484 private void buildPatchFromDirectory(@NotNull final PatchBuilder builder,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
485 @NotNull final File repRoot,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
486 @NotNull final CheckoutRules checkoutRules,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
487 @NotNull final FileFilter filter) throws IOException {
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
488 buildPatchFromDirectory(repRoot, builder, repRoot, checkoutRules, filter);
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
489 }
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
490
815
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
491 private void buildPatchFromDirectory(@NotNull final File curDir,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
492 @NotNull final PatchBuilder builder,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
493 @NotNull final File repRoot,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
494 @NotNull final CheckoutRules checkoutRules,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
495 @NotNull final FileFilter filter) throws IOException {
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
496 File[] files = curDir.listFiles(filter);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
497 if (files != null) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
498 for (File realFile: files) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
499 String relPath = realFile.getAbsolutePath().substring(repRoot.getAbsolutePath().length());
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
500 String mappedPath = checkoutRules.map(relPath);
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
501 if (mappedPath != null && mappedPath.length() > 0) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
502 final File virtualFile = new File(mappedPath);
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
503 if (realFile.isDirectory()) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
504 builder.createDirectory(virtualFile);
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
505 buildPatchFromDirectory(realFile, builder, repRoot, checkoutRules, filter);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
506 } else {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
507 final FileInputStream is = new FileInputStream(realFile);
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
508 try {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
509 builder.createBinaryFile(virtualFile, null, is, realFile.length());
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
510 } finally {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
511 is.close();
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
512 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
513 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
514 } else {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
515 if (realFile.isDirectory()) {
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
516 buildPatchFromDirectory(realFile, builder, repRoot, checkoutRules, filter);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
517 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
518 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
519 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
520 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
521 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
522
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
523 /* clone the repo if it doesn't exist, pull the repo if it doesn't contain specified changeSet */
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
524 private void syncRepository(@NotNull final HgVcsRoot root, @NotNull final ChangeSet cset) throws VcsException {
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
525 File workingDir = getWorkingDir(root);
225
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
526 lockWorkDir(workingDir);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
527 HgRepo repo = createRepo(root);
225
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
528 try {
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
529 if (!repo.isValidRepository())
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
530 repo.init().call();
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
531 if (repo.containsRevision(cset))
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
532 return;
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
533 repo.setDefaultPath(root.getRepository());
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
534 repo.setTeamCityConfig(root.getCustomHgConfig());
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
535 try {
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
536 repo.pull().fromRepository(root.getRepository())
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
537 .withTimeout(myConfig.getPullTimeout())
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
538 .withProfile(myConfig.runWithProfile(root))
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
539 .call();
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
540 } catch (UnrelatedRepositoryException e) {
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
541 Loggers.VCS.warn("Repository at " + root.getRepository() + " is unrelated, clone it again");
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
542 myMirrorManager.forgetDir(workingDir);
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
543 syncRepository(root, cset);
225
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
544 }
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
545 } finally {
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
546 unlockWorkDir(workingDir);
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
547 }
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
548 }
1ef1baff91af TW-15861: do pull in getContent() only if local repository does not contain revision of interest
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 220
diff changeset
549
695
5164285ece2b fix tests
eugene.petrenko@gmail.com
parents: 688
diff changeset
550 public void syncRepository(@NotNull final VcsRoot root) throws VcsException {
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
551 syncRepository(getHgRoot(root));
695
5164285ece2b fix tests
eugene.petrenko@gmail.com
parents: 688
diff changeset
552 }
5164285ece2b fix tests
eugene.petrenko@gmail.com
parents: 688
diff changeset
553
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
554 public void syncRepository(@NotNull final HgVcsRoot root) throws VcsException {
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
555 syncRepository(root, new SyncSettings<Void>(VcsCallable.NO_OP));
783
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 737
diff changeset
556 }
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 737
diff changeset
557
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
558 public <T> T syncRepository(@NotNull HgVcsRoot root, @NotNull SyncSettings<T> settings) throws VcsException {
793
0a1ac46bfa8c TW-33522 do not retry clone for repositories with custom clone dirs
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 792
diff changeset
559 boolean customWorkingDir = root.getCustomWorkingDir() != null;
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
560 File workingDir = getWorkingDir(root);
792
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
561 int attemptsLeft = 3;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
562 VcsException lastError = null;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
563 while (attemptsLeft-- > 0) {
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
564 try {
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
565 return syncRepositoryOnce(root, settings, workingDir);
792
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
566 } catch (UnrelatedRepositoryException e) {
793
0a1ac46bfa8c TW-33522 do not retry clone for repositories with custom clone dirs
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 792
diff changeset
567 if (customWorkingDir)
794
7a8caf98dc6e Explain that a manual recovery is required.
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 793
diff changeset
568 throw new VcsException(e.getMessage() + ". VCS root uses a custom clone dir, manual recovery is required.", e);
792
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
569 Loggers.VCS.warn("Repository at " + workingDir.getAbsolutePath() + " is unrelated to " + root.getRepository() +
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
570 ". Clone it again, attempts left " + attemptsLeft);
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
571 myMirrorManager.forgetDir(workingDir);
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
572 lastError = e;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
573 } catch (AbandonedTransactionFound e) {
793
0a1ac46bfa8c TW-33522 do not retry clone for repositories with custom clone dirs
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 792
diff changeset
574 if (customWorkingDir)
794
7a8caf98dc6e Explain that a manual recovery is required.
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 793
diff changeset
575 throw new VcsException(e.getMessage() + ". VCS root uses a custom clone dir, manual recovery is required.", e);
792
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
576 Loggers.VCS.warn("Abandoned transaction found in repository " + root.getRepository() + " at "
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
577 + workingDir.getAbsolutePath() + ". Clone it again, attempts left " + attemptsLeft);
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
578 myMirrorManager.forgetDir(workingDir);
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
579 lastError = e;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
580 }
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
581 }
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
582 throw lastError;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
583 }
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
584
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
585
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
586 private <T> T syncRepositoryOnce(@NotNull HgVcsRoot root, @NotNull SyncSettings<T> settings, @NotNull File workingDir) throws VcsException {
876
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
587 lockWorkDir(workingDir, settings.getProgressConsumer());
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
588 HgRepo repo = createRepo(root);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
589 try {
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
590 if (!repo.isValidRepository())
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
591 repo.init().call();
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
592 repo.setDefaultPath(root.getRepository());
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
593 repo.setTeamCityConfig(root.getCustomHgConfig());
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
594 resetBookmarks(repo);
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
595 repo.pull().fromRepository(root.getRepository())
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
596 .withTimeout(myConfig.getPullTimeout())
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
597 .withProgressConsumer(settings.getProgressConsumer())
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
598 .withProfile(myConfig.runWithProfile(root))
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
599 .call();
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
600 return settings.getCmd().call();
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
601 } finally {
181
0ea2ad14ce97 Add local mirrors for agent checkout. To turn them on set agent property teamcity.hg.use.local.mirrors = true.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 175
diff changeset
602 unlockWorkDir(workingDir);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
603 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
604 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
605
529
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
606
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
607 private void resetBookmarks(HgRepo repo) throws VcsException {
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
608 if (!myConfig.bookmarksEnabled())
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
609 return;
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
610 HgVersion v = repo.version().call();
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
611 if (v.isEqualsOrGreaterThan(BookmarksCommand.REQUIRED_HG_VERSION))
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
612 repo.resetBookmarks();
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
613 }
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
614
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
615 @Override
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
616 public LabelingSupport getLabelingSupport() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
617 return this;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
618 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
619
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
620 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
621 public VcsFileContentProvider getContentProvider() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
622 return this;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
623 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
624
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
625 @NotNull
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 566
diff changeset
626 public MercurialCollectChangesPolicy getCollectChangesPolicy() {
873
95e7d2ff8945 Run hg pull with progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 872
diff changeset
627 return new MercurialCollectChangesPolicy(myProgressProvider, this, myConfig, myHgVcsRootFactory, myRepoFactory, myHgPathProvider);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
628 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
629
312
8deb526363f5 TW-17882 report changes from the merged named branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 309
diff changeset
630
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
631 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
632 public BuildPatchPolicy getBuildPatchPolicy() {
412
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
633 return this;
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
634 }
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
635
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
636 public void buildPatch(@NotNull final VcsRoot root,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
637 @Nullable final String fromVersion,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
638 @NotNull final String toVersion,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
639 @NotNull final PatchBuilder builder,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
640 @NotNull final CheckoutRules checkoutRules) throws IOException, VcsException {
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
641 final HgVcsRoot hgRoot = getHgRoot(root);
641
da9ab34663d8 Do not implement VcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 635
diff changeset
642 buildPatch(hgRoot, fromVersion, toVersion, builder, checkoutRules);
da9ab34663d8 Do not implement VcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 635
diff changeset
643 }
da9ab34663d8 Do not implement VcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 635
diff changeset
644
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
645 public void buildPatch(@NotNull final HgVcsRoot hgRoot,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
646 @Nullable final String fromVersion,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
647 @NotNull final String toVersion,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
648 @NotNull final PatchBuilder builder,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
649 @NotNull final CheckoutRules checkoutRules) throws IOException, VcsException {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
650 syncRepository(hgRoot);
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
651
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
652 final ChangeSet to = new ChangeSet(toVersion);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
653
412
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
654 if (fromVersion == null) {
444
a05eca69fc01 Ensure plugin works without revnums in revisions
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 441
diff changeset
655 buildFullPatch(hgRoot, to, builder, checkoutRules);
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
656 return;
412
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
657 }
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
658
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
659 final ChangeSet from = new ChangeSet(fromVersion);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
660 final HgRepo repo = createRepo(hgRoot);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
661 if (repo.containsRevision(from)) {
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
662 buildIncrementalPatch(hgRoot, from, to, builder, checkoutRules);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
663 return;
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
664 }
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
665
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
666 Loggers.VCS.info("Cannot find revision " + fromVersion + " in repository " + hgRoot.getRepository() + ", will build a full patch");
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
667 cleanCheckoutDir(builder, checkoutRules);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
668 buildFullPatch(hgRoot, to, builder, checkoutRules);
412
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
669 }
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
670
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
671 private void cleanCheckoutDir(@NotNull PatchBuilder builder, @NotNull CheckoutRules checkoutRules) throws IOException {
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
672 builder.deleteDirectory(new File(checkoutRules.map("")), true);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
673 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
674
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
675 private void lockWorkDir(@NotNull File workDir) {
876
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
676 lockWorkDir(workDir, null);
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
677 }
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
678
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
679 private void lockWorkDir(@NotNull File workDir, @Nullable ProgressParser.ProgressConsumer progressConsumer) {
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
680 if (progressConsumer != null)
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
681 progressConsumer.consume(-1f, "Acquire repository lock");
356
53b430731041 TW-19984 ensure map file cleaned as well
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 355
diff changeset
682 myMirrorManager.lockDir(workDir);
876
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
683 if (progressConsumer != null)
b2816067699a Report lock acquisition progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 873
diff changeset
684 progressConsumer.consume(-1f, "Repository lock acquired");
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
685 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
686
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
687 private void unlockWorkDir(@NotNull File workDir) {
356
53b430731041 TW-19984 ensure map file cleaned as well
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 355
diff changeset
688 myMirrorManager.unlockDir(workDir);
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
689 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
690
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
691 @Override
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
692 public boolean allowSourceCaching() {
633
6ed9e0528564 Add an option to allow patch caching when server-side checkout is used
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
693 return myConfig.allowSourceCaching();
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
694 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
695
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
696 @NotNull
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
697 public String label(@NotNull String label, @NotNull String version, @NotNull VcsRoot root, @NotNull CheckoutRules checkoutRules) throws VcsException {
245
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
698 File tmpDir = null;
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
699 try {
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
700 tmpDir = createLabelingTmpDir();
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
701 HgVcsRoot hgRoot = getHgRoot(root);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
702 hgRoot.setCustomWorkingDir(tmpDir);
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
703 syncRepository(hgRoot);
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
704 HgRepo repo = createRepo(hgRoot);
605
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
705 String branchName = getCommitBranch(repo, version);
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
706 repo.update().branch(branchName).call();
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
707
245
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
708 String fixedTagname = fixTagName(label);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
709 repo.tag().revision(version)
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
710 .tagName(fixedTagname)
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
711 .byUser(hgRoot.getUserForTag())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
712 .call();
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
713
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
714 repo.push().toRepository(hgRoot.getRepository()).call();
245
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
715 return fixedTagname;
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
716 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
717 deleteDir(tmpDir, Loggers.VCS);
245
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
718 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
719 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
720
605
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
721 @NotNull
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
722 private String getCommitBranch(@NotNull HgRepo repo, @NotNull String cset) throws VcsException {
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
723 return repo.id().inLocalRepository().revision(cset).showBranch().call();
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
724 }
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
725
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
726 private String fixTagName(final String label) {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
727 // according to Mercurial documentation http://hgbook.red-bean.com/hgbookch8.html#x12-1570008
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
728 // tag name must not contain:
246
8ffe311f9b8e fix comments
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 245
diff changeset
729 // Colon (ASCII 58, ':')
8ffe311f9b8e fix comments
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 245
diff changeset
730 // Carriage return (ASCII 13, '\r')
8ffe311f9b8e fix comments
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 245
diff changeset
731 // Newline (ASCII 10, '\n')
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
732 // all these characters will be replaced with _ (underscore)
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
733 return label.replace(':', '_').replace('\r', '_').replace('\n', '_');
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
734 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
735
635
f0dce200f02a Implement tryMerge
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 634
diff changeset
736 public File getWorkingDir(HgVcsRoot root) {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
737 File customDir = root.getCustomWorkingDir();
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
738 return customDir != null ? customDir : myMirrorManager.getMirrorDir(root.getRepository());
184
c6de9e076765 add method to get working dir for settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 182
diff changeset
739 }
c6de9e076765 add method to get working dir for settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 182
diff changeset
740
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
741
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
742 public boolean isAgentSideCheckoutAvailable() {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
743 return true;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
744 }
241
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
745
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
746
244
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
747 private File createLabelingTmpDir() throws VcsException {
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
748 try {
467
bc2e00800054 TW-22279 use shorter temprorary dir name for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 461
diff changeset
749 return HgFileUtil.createTempDir();
244
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
750 } catch (IOException e) {
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
751 throw new VcsException("Unable to create temporary directory");
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
752 }
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
753 }
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
754
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
755
241
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
756 /* for tests only */
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
757 public MirrorManager getMirrorManager() {
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
758 return myMirrorManager;
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
759 }
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
760
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
761
317
c247d4637a96 Make hg dag-based
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 315
diff changeset
762 @Override
c247d4637a96 Make hg dag-based
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 315
diff changeset
763 public boolean isDAGBasedVcs() {
324
86a668c1c82b Make hg dag-based again
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 323
diff changeset
764 return true;
317
c247d4637a96 Make hg dag-based
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 315
diff changeset
765 }
339
b799355b4016 Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 335 338
diff changeset
766
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
767 private static class IgnoreDotHgFilter implements FileFilter {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
768 public boolean accept(final File file) {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
769 return !(file.isDirectory() && ".hg".equals(file.getName()));
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
770 }
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
771 }
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
772
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
773 private static class AcceptAllFilter implements FileFilter {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
774 public boolean accept(File pathname) {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
775 return true;
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
776 }
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
777 }
342
040cd38f6f9e Use factory to create repository state
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
778
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
779 @NotNull
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
780 public ServerHgRepo createRepo(@NotNull HgVcsRoot root) throws VcsException {
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
781 return myRepoFactory.createRepo(root, getWorkingDir(root));
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
782 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
783
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
784 @NotNull
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 541
diff changeset
785 public ServerHgRepo createRepo(@NotNull OperationContext ctx, @NotNull HgVcsRoot root) throws VcsException {
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
786 return ctx.createRepo(root, getWorkingDir(root));
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 541
diff changeset
787 }
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 541
diff changeset
788
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
789 @NotNull
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
790 public ServerHgRepo createRepo(@NotNull HgVcsRoot root, @NotNull File customDir) throws VcsException {
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
791 return myRepoFactory.createRepo(root, customDir);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
792 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
793
342
040cd38f6f9e Use factory to create repository state
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
794 @NotNull
411
490024d8e5fd Test patch from newer revision to earlier
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 408
diff changeset
795 @Override
439
f957619d2b04 method renamed
Pavel.Sher
parents: 436
diff changeset
796 public Map<String, String> getCheckoutProperties(@NotNull VcsRoot root) {
416
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
797 Map<String, String> rootProperties = root.getProperties();
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
798 Map<String, String> repositoryProperties = new HashMap<String, String>();
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
799 repositoryProperties.put(Constants.REPOSITORY_PROP, rootProperties.get(Constants.REPOSITORY_PROP));
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
800 repositoryProperties.put(Constants.INCLUDE_SUBREPOS_IN_PATCH, rootProperties.get(Constants.INCLUDE_SUBREPOS_IN_PATCH));
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
801 String customHgConfig = rootProperties.get(Constants.CUSTOM_HG_CONFIG_PROP);
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
802 if (!isEmpty(customHgConfig))
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 865
diff changeset
803 repositoryProperties.put(Constants.CUSTOM_HG_CONFIG_PROP, customHgConfig);
416
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
804 return repositoryProperties;
411
490024d8e5fd Test patch from newer revision to earlier
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 408
diff changeset
805 }
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
806
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
807
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
808 @Override
435
4b6cca841ea5 New list files API
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
809 public ListFilesPolicy getListFilesPolicy() {
667
bcee3a8b2c7b Add TTL for list file policy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 652
diff changeset
810 return new ListFilesSupport(this, myConfig, myHgVcsRootFactory);
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
811 }
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
812
678
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
813 @NotNull
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
814 public UrlSupport getUrlSupport() {
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
815 return new MercurialUrlSupport(this);
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
816 }
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
817
522
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
818 @Override
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
819 @Nullable
522
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
820 protected <T extends VcsExtension> T getVcsCustomExtension(@NotNull final Class<T> extensionClass) {
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
821 for (MercurialServerExtension e : myExtensions) {
522
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
822 if (extensionClass.isInstance(e))
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
823 return extensionClass.cast(e);
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
824 }
652
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
825 return super.getVcsCustomExtension(extensionClass);
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
826 }
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
827
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
828
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
829 private static class ExcludeHgArchival implements FileFilter {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
830 public boolean accept(File f) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
831 return !f.getName().equals(".hg_archival.txt");
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
832 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
833 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
834 }