annotate mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java @ 853:820d02ac9b8a

Map subrepo path when we remove it
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 03 Jul 2014 22:12:06 +0200
parents fcc2a5bf4238
children 24a6ef9166ae
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
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
18 import com.intellij.openapi.util.text.StringUtil;
174
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.Used;
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.AbstractVcsPropertiesProcessor;
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
21 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
22 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
23 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
24 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
25 import jetbrains.buildServer.log.Loggers;
652
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
26 import jetbrains.buildServer.serverSide.InvalidProperty;
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
27 import jetbrains.buildServer.serverSide.PropertiesProcessor;
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
28 import jetbrains.buildServer.serverSide.ServerListener;
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
29 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
30 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
31 import jetbrains.buildServer.util.FileUtil;
372
2869f49b9211 TW-17252 handle mercurial caches correctly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 371
diff changeset
32 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
33 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
34 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
35 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
36 import org.apache.commons.compress.archivers.ArchiveInputStream;
688
5f3b5d95504e Get rid of ArchiveUtil
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 686
diff changeset
37 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
38 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
39 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
40
809
44f0842ea5b1 use BufferedInputStream
eugene.petrenko@jetbrains.com
parents: 808
diff changeset
41 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
42 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
43
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 {
355
69d66e4f60e3 Extract MirrorManager interface
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 352
diff changeset
58 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
59 private final ServerPluginConfig myConfig;
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
60 private final HgPathProvider myHgPathProvider;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
61 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
62 private final HgVcsRootFactory myHgVcsRootFactory;
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
63 private final FileFilter myIgnoreDotHgFilter = new IgnoreDotHgFilter();
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
64 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
65 private final HgTestConnectionSupport myTestConnection;
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
66 private final SubrepoCheckoutRulesProvider mySubrepoCheckoutRulesProvider;
631
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
67 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
68
514
89e9c06fbc76 Move TeamCity-specific logic to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 511
diff changeset
69 public MercurialVcsSupport(@NotNull final EventDispatcher<ServerListener> dispatcher,
372
2869f49b9211 TW-17252 handle mercurial caches correctly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 371
diff changeset
70 @NotNull final ResetCacheRegister resetCacheHandlerManager,
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
71 @NotNull final ServerPluginConfig config,
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
72 @NotNull final HgPathProvider hgPathProvider,
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
73 @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
74 @NotNull final MirrorManager mirrorManager,
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
75 @NotNull final HgVcsRootFactory hgVcsRootFactory,
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
76 @NotNull final HgTestConnectionSupport testConnection,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
77 @NotNull final SubrepoCheckoutRulesProvider subrepoCheckoutRulesProvider) {
256
73708ca4521f Add ability to disable pull protocol
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 252
diff changeset
78 myConfig = config;
356
53b430731041 TW-19984 ensure map file cleaned as well
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 355
diff changeset
79 myMirrorManager = mirrorManager;
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
80 myHgPathProvider = hgPathProvider;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
81 myRepoFactory = repoFactory;
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
82 myHgVcsRootFactory = hgVcsRootFactory;
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
83 myTestConnection = testConnection;
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
84 mySubrepoCheckoutRulesProvider = subrepoCheckoutRulesProvider;
372
2869f49b9211 TW-17252 handle mercurial caches correctly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 371
diff changeset
85 resetCacheHandlerManager.registerHandler(new MercurialResetCacheHandler(myMirrorManager));
514
89e9c06fbc76 Move TeamCity-specific logic to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 511
diff changeset
86 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
87 @Override
408
b34ffc622efc TW-20295 store log.template in the temp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 404
diff changeset
88 public void serverShutdown() {
b34ffc622efc TW-20295 store log.template in the temp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 404
diff changeset
89 myRepoFactory.dispose();
b34ffc622efc TW-20295 store log.template in the temp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 404
diff changeset
90 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
91 });
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
92 logUsedHg();
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
93 }
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
94
631
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
95 public void addExtensions(@NotNull Collection<MercurialServerExtension> extensions) {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
96 myExtensions.addAll(extensions);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
97 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
98
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
99 public void addExtension(@NotNull MercurialServerExtension extension) {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 627
diff changeset
100 myExtensions.add(extension);
514
89e9c06fbc76 Move TeamCity-specific logic to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 511
diff changeset
101 }
89e9c06fbc76 Move TeamCity-specific logic to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 511
diff changeset
102
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
103 private void logUsedHg() {
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
104 String hgPath = myConfig.getHgPath();
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
105 if (hgPath != null)
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
106 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
107 else
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 276
diff changeset
108 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
109 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
110
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
111 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
112 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
113 @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
114 @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
115 @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
116 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
117 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
118 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
119
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
120 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
121 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
122 ChangeSet cset = new ChangeSet(version);
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
123 HgVcsRoot root = getHgRoot(vcsRoot);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
124 syncRepository(root, cset);
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
125 HgRepo repo = createRepo(root);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
126 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
127 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
128 try {
397
36b1bc5add89 Method getContent() should throw exception for non-existing files
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
129 return FileUtil.loadFileBytes(file);
36b1bc5add89 Method getContent() should throw exception for non-existing files
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
130 } catch (IOException e) {
36b1bc5add89 Method getContent() should throw exception for non-existing files
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 380
diff changeset
131 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
132 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
133 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
134 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
135 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
136
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
137 @NotNull
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
138 public HgVcsRoot getHgRoot(@NotNull final VcsRoot vcsRoot) throws VcsException {
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
139 return myHgVcsRootFactory.createHgRoot(vcsRoot);
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
140 }
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
141
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
142 @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
143 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
144 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
145 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
146
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
147 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
148 @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
149 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
150 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
151 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
152
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
153 @Nullable
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
154 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
155 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
156 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
157 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
158 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
159 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
160 }
174
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.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
162 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
163 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
164 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
165 }
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 }
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 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
170 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
171 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
172 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
173
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
174 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
175 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
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
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
178 @NotNull
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
179 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
180 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
181 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
182
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
183 @Override
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
184 @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
185 public TestConnectionSupport getTestConnectionSupport() {
430
3600b68a4c0c TW-21403 better error message when hg not found
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 429
diff changeset
186 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
187 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
188
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
189 @Nullable
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
190 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
191 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
192 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
193 defaults.put(Constants.HG_COMMAND_PATH_PROP, "hg");
502
2755266b7dd5 Use uncompressed transfer explicitly
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 501
diff changeset
194 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
195 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
196 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
197
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
198 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
199 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
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
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
202 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
203 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
204 // 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
205 // 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
206 // 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
207 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
208 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
209 try {
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 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
211 } 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
212 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
213 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
214 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
215 };
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 // builds patch from version to version
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
219 private void buildIncrementalPatch(@NotNull final HgVcsRoot root,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
220 @NotNull final ChangeSet fromVer,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
221 @NotNull final ChangeSet toVer,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
222 @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
223 @NotNull final CheckoutRules checkoutRules) throws VcsException, IOException {
808
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
224 final HgRepo repo = createRepo(root);
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
225 final List<FileStatus> modifiedFiles = repo.status().fromRevision(fromVer).toRevision(toVer).call();
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
226 final List<String> notDeletedFiles = new ArrayList<String>();
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
227 for (FileStatus f: modifiedFiles) {
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
228 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
229 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
230 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
231 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
232
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
233 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
234 try {
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
235 if (root.useArchiveForPatch()) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
236 parentDir = HgFileUtil.createTempDir();
808
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
237 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
238 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
239 } else {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
240 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
241 for (FileStatus f: modifiedFiles) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
242 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
243 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
244 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
245 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
246 builder.deleteFile(virtualFile, true);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
247 } else {
808
eugene.petrenko@jetbrains.com
parents: 806
diff changeset
248 final File realFile = new File(parentDir, f.getPath());
809
44f0842ea5b1 use BufferedInputStream
eugene.petrenko@jetbrains.com
parents: 808
diff changeset
249 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
250 try {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
251 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
252 } finally {
809
44f0842ea5b1 use BufferedInputStream
eugene.petrenko@jetbrains.com
parents: 808
diff changeset
253 FileUtil.close(is);
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
254 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
255 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
256 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
257 }
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
258 if (root.includeSubreposInPatch())
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
259 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
260 } 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
261 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
262 throw (VcsException) e;
67753eb68a09 Don't build a clean patch if incremental patch fails
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 794
diff changeset
263 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
264 } finally {
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
265 if (parentDir != null)
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
266 deleteDir(parentDir, Loggers.VCS);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
267 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
268 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
269
805
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
270 private void buildIncrementalPatchWithArchive(@NotNull final PatchBuilder builder,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
271 @NotNull final HgRepo repo,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
272 @NotNull final ChangeSet toVer,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
273 @NotNull final CheckoutRules checkoutRules,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
274 @NotNull final List<FileStatus> modifiedFiles,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
275 @NotNull final List<String> notDeletedFiles,
eugene.petrenko@jetbrains.com
parents: 799
diff changeset
276 @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
277 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
278 int i = 0;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
279 while (i < notDeletedFiles.size()) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
280 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
281 if (mappedPath == null) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
282 i++;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
283 continue;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
284 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
285 if (archive.addIncludeRule(notDeletedFiles.get(i))) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
286 i++;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
287 continue;
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
288 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
289 //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
290 archive.call();
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
291 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
292 FileUtil.delete(archiveFile);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
293 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
294 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
295 if (!notDeletedFiles.isEmpty()) {
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
296 archive.call();
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
297 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
298 FileUtil.delete(archiveFile);
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
299 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
300
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
301 //delete removed files
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
302 for (FileStatus f: modifiedFiles) {
813
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
303 if (f.getStatus() != Status.REMOVED) continue; //other files processed below
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
304
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
305 final String mappedPath = checkoutRules.map(f.getPath());
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
306 if (mappedPath == null) continue; // skip
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
307
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
308 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
309 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
310 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
311
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
312
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
313 private void buildSubrepoPatch(@NotNull HgVcsRoot mainRoot,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
314 @NotNull ChangeSet mainRootFromRevision,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
315 @NotNull ChangeSet mainRootToRevision,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
316 @NotNull PatchBuilder builder,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
317 @NotNull CheckoutRules mainRootRules,
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
318 @NotNull HgRepo mainRepo) throws IOException, VcsException {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
319 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
320 for (HgSubrepoConfigChange configChange : subrepoConfigChanges) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
321 try {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
322 String subrepoPath = configChange.getPath();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
323 if (!mainRootRules.shouldInclude(subrepoPath))
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
324 continue;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
325 SubRepo currentSubrepo = configChange.getCurrent();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
326
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
327 if (configChange.subrepoAdded()) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
328 assert currentSubrepo != null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
329 String subrepoUrl = currentSubrepo.resolveUrl(mainRoot.getRepository());
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
330 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
331 String subrepoFromRevision = null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
332 String subrepoToRevision = currentSubrepo.revision();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
333 CheckoutRules subrepoRules = mySubrepoCheckoutRulesProvider.getSubrepoRules(mainRootRules, subrepoPath);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
334 buildPatch(subrepoRoot, subrepoFromRevision, subrepoToRevision, builder, subrepoRules);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
335
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
336 } else if (configChange.subrepoRemoved()) {
853
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
337 deleteDirInPatch(builder, mainRootRules, subrepoPath);
587
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.subrepoUrlChanged()) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
340 assert currentSubrepo != null;
853
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
341 deleteDirInPatch(builder, mainRootRules, subrepoPath);
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
342
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
343 String subrepoUrl = currentSubrepo.resolveUrl(mainRoot.getRepository());
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
344 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
345 String subrepoFromRevision = null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
346 String subrepoToRevision = currentSubrepo.revision();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
347 CheckoutRules subrepoRules = mySubrepoCheckoutRulesProvider.getSubrepoRules(mainRootRules, subrepoPath);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
348 buildPatch(subrepoRoot, subrepoFromRevision, subrepoToRevision, builder, subrepoRules);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
349
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
350 } else {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
351 assert currentSubrepo != null;
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
352 String subrepoUrl = currentSubrepo.resolveUrl(mainRoot.getRepository());
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
353 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
354 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
355 String subrepoToRevision = currentSubrepo.revision();
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
356 CheckoutRules subrepoRules = mySubrepoCheckoutRulesProvider.getSubrepoRules(mainRootRules, subrepoPath);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
357 buildPatch(subrepoRoot, subrepoFromRevision, subrepoToRevision, builder, subrepoRules);
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
358 }
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 696
diff changeset
359 } catch (WrongSubrepoUrlException e) {
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
360 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
361 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
362 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
363 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 586
diff changeset
364
853
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
365 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
366 for (IncludeRule rule : rules.getRootIncludeRules()) {
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
367 String mappedPath = rule.map(unMappedPath);
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
368 if (mappedPath != null)
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
369 builder.deleteDirectory(new File(mappedPath), true);
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
370 }
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
371 }
820d02ac9b8a Map subrepo path when we remove it
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 851
diff changeset
372
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
373 // builds patch by exporting files using specified version
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
374 private void buildFullPatch(@NotNull final HgVcsRoot root,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
375 @NotNull final ChangeSet toVer,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
376 @NotNull final PatchBuilder builder,
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
377 @NotNull final CheckoutRules checkoutRules) throws IOException, VcsException {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
378 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
379 try {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
380 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
381 if (root.includeSubreposInPatch()) {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
382 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
383 if (!subrepos.isEmpty()) {
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
384 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
385 final File mirrorDir = getWorkingDir(root);
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
386 final HgRepo cloneOfTheMirror = createRepo(root, tempDir);
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
387 cloneOfTheMirror.doClone().fromRepository(mirrorDir)
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
388 .setUpdateWorkingDir(false)
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
389 .setUsePullProtocol(false)
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
390 .useUncompressedTransfer(false)
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
391 .call();
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
392 cloneOfTheMirror.setDefaultPath(root.getRepository());
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
393 cloneSubrepos(root, tempDir, subrepos);
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
394 cloneOfTheMirror.update().toRevision(toVer).call();
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
395 buildPatchFromDirectory(builder, tempDir, checkoutRules, myIgnoreDotHgFilter);
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
396 } else {
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
397 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
398 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
399 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
400 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
401 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
402 } else {
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
403 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
404 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
405 }
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
406 }
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
407 } else {
675
1d417eb6ea28 Add an option for excluding subrepos from patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 667
diff changeset
408 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
409 if (root.useArchiveForPatch()) {
816
eugene.petrenko@jetbrains.com
parents: 815
diff changeset
410 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
411 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
412 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
413 } else {
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
414 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
415 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
416 }
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
417 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
418 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
419 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
420 }
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
586
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
423 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
424 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
425 String path = e.getKey();
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
426 SubRepo subrepoConfig = e.getValue();
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
427 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
428 continue;
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
429 String parentRepositoryUrl = mainRoot.getRepository();
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
430 try {
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
431 String subrepoUrl = subrepoConfig.resolveUrl(parentRepositoryUrl);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
432 HgVcsRoot subrepoRoot = mainRoot.withUrl(subrepoUrl);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
433 HgRepo subrepo = createRepo(subrepoRoot);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
434 if (!subrepo.containsRevision(subrepoConfig.revision()))
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
435 syncRepository(subrepoRoot);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
436
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
437 File subrepoMirrorDir = getWorkingDir(subrepoRoot);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
438 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
439 HgRepo cloneOfSubrepoMirror = createRepo(subrepoRoot, subrepoDir);
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
440 cloneOfSubrepoMirror.doClone().fromRepository(subrepoMirrorDir)
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
441 .setUpdateWorkingDir(false)
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
442 .setUsePullProtocol(false)
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
443 .useUncompressedTransfer(false)
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
444 .call();
737
ecbca39d0aef Use a resolved subrepo url as a default path
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 732
diff changeset
445 cloneOfSubrepoMirror.setDefaultPath(subrepoUrl);
586
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
446
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
447 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
448 if (!subSubrepos.isEmpty())
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
449 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
450 } catch (WrongSubrepoUrlException error) {
586
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
451 //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
452 }
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
453 }
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
454 }
aa515fa1f626 Clean patch uses subrepo mirrors on the server
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 572
diff changeset
455
813
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
456 private void buildPatchFromArchive(@NotNull final PatchBuilder builder,
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
457 @NotNull final File archive,
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
458 @NotNull final CheckoutRules checkoutRules,
eugene.petrenko@jetbrains.com
parents: 809
diff changeset
459 @NotNull final FileFilter filter) throws IOException {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
460 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
461 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
462 try {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
463 fis = new BufferedInputStream(new FileInputStream(archive));
688
5f3b5d95504e Get rid of ArchiveUtil
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 686
diff changeset
464 is = new TarArchiveInputStream(fis);
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
465
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
466 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
467 while ((entry = is.getNextEntry()) != null) {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
468 if (entry.isDirectory()) continue;
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
469
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
470 String fileName = entry.getName();
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
471 //TODO: does it work if I have arch/ in my repo?
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
472 if (fileName.startsWith("arch/")) fileName = fileName.substring(5);
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 if (!filter.accept(new File(fileName))) continue;
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
475
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
476 final String mappedFile = checkoutRules.map(fileName);
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
477 if (!StringUtil.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
478 builder.createBinaryFile(new File(mappedFile), null, is, entry.getSize());
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
479 }
686
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
480 }
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
481 } finally {
814
44bf3a609d67 use BufferedInputStream, added TODO
eugene.petrenko@jetbrains.com
parents: 813
diff changeset
482 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
483 }
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
484 }
1efd1846f00a Add an option for using tar archive for building a full patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 678
diff changeset
485
815
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
486 private void buildPatchFromDirectory(@NotNull final PatchBuilder builder,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
487 @NotNull final File repRoot,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
488 @NotNull final CheckoutRules checkoutRules,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
489 @NotNull final FileFilter filter) throws IOException {
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
490 buildPatchFromDirectory(repRoot, builder, repRoot, checkoutRules, filter);
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
491 }
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
492
815
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
493 private void buildPatchFromDirectory(@NotNull final File curDir,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
494 @NotNull final PatchBuilder builder,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
495 @NotNull final File repRoot,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
496 @NotNull final CheckoutRules checkoutRules,
f77739de2133 @NotNull
eugene.petrenko@jetbrains.com
parents: 814
diff changeset
497 @NotNull final FileFilter filter) throws IOException {
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
498 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
499 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
500 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
501 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
502 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
503 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
504 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
505 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
506 builder.createDirectory(virtualFile);
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
507 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
508 } else {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
509 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
510 try {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
511 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
512 } finally {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
513 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
514 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
515 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
516 } else {
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
517 if (realFile.isDirectory()) {
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
518 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
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 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
523 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
524
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
525 /* 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
526 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
527 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
528 lockWorkDir(workingDir);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
529 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
530 try {
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
531 if (repo.isValidRepository()) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
532 if (repo.containsRevision(cset))
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
533 return;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
534 try {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
535 repo.pull().fromRepository(root.getRepository())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
536 .withTimeout(myConfig.getPullTimeout())
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
537 .call();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
538 } catch (UnrelatedRepositoryException e) {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
539 Loggers.VCS.warn("Repository at " + root.getRepository() + " is unrelated, clone it again");
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
540 myMirrorManager.forgetDir(workingDir);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
541 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
542 }
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
543 } else {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
544 repo.doClone().fromRepository(root.getRepository())
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
545 .useUncompressedTransfer(root.isUncompressedTransfer())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
546 .setUpdateWorkingDir(false)
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
547 .call();
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
548 repo.setDefaultPath(root.getRepository());
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
549 }
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
550 } 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
551 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
552 }
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
553 }
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
554
695
5164285ece2b fix tests
eugene.petrenko@gmail.com
parents: 688
diff changeset
555 public void syncRepository(@NotNull final VcsRoot root) throws VcsException {
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
556 syncRepository(getHgRoot(root));
695
5164285ece2b fix tests
eugene.petrenko@gmail.com
parents: 688
diff changeset
557 }
5164285ece2b fix tests
eugene.petrenko@gmail.com
parents: 688
diff changeset
558
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
559 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
560 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
561 }
d60aa99940ba TW-36113 retrieve bookmarks with repository lock held
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 737
diff changeset
562
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
563 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
564 boolean customWorkingDir = root.getCustomWorkingDir() != null;
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
565 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
566 int attemptsLeft = 3;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
567 VcsException lastError = null;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
568 while (attemptsLeft-- > 0) {
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
569 try {
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
570 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
571 } 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
572 if (customWorkingDir)
794
7a8caf98dc6e Explain that a manual recovery is required.
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 793
diff changeset
573 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
574 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
575 ". 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
576 myMirrorManager.forgetDir(workingDir);
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
577 lastError = e;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
578 } 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
579 if (customWorkingDir)
794
7a8caf98dc6e Explain that a manual recovery is required.
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 793
diff changeset
580 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
581 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
582 + 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
583 myMirrorManager.forgetDir(workingDir);
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
584 lastError = e;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
585 }
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
586 }
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
587 throw lastError;
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
588 }
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
589
75aed0d7a1f9 TW-33522 limit the number of repository clone attempts
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 783
diff changeset
590
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
591 private <T> T syncRepositoryOnce(@NotNull HgVcsRoot root, @NotNull SyncSettings<T> settings, @NotNull File workingDir) throws VcsException {
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
592 lockWorkDir(workingDir);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
593 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
594 try {
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
595 if (repo.isValidRepository()) {
529
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
596 resetBookmarks(repo);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
597 repo.pull().fromRepository(root.getRepository())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
598 .withTimeout(myConfig.getPullTimeout())
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
599 .withProgressConsumer(settings.getProgressConsumer())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
600 .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 } else {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
602 repo.doClone().fromRepository(root.getRepository())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
603 .setUpdateWorkingDir(false)
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
604 .useUncompressedTransfer(root.isUncompressedTransfer())
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
605 .withProgressConsumer(settings.getProgressConsumer())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
606 .call();
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
607 repo.setDefaultPath(root.getRepository());
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
608 }
799
b130c7d27c02 Report clone/pull progress
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 796
diff changeset
609 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
610 } 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
611 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
612 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
613 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
614
529
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
615
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
616 private void resetBookmarks(HgRepo repo) throws VcsException {
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
617 if (!myConfig.bookmarksEnabled())
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
618 return;
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
619 HgVersion v = repo.version().call();
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
620 if (v.isEqualsOrGreaterThan(BookmarksCommand.REQUIRED_HG_VERSION))
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
621 repo.resetBookmarks();
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
622 }
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 522
diff changeset
623
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
624 @Override
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
625 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
626 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
627 }
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 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
630 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
631 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
632 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
633
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
634 @NotNull
567
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 566
diff changeset
635 public MercurialCollectChangesPolicy getCollectChangesPolicy() {
27cd2503cea3 Extract MercurialCollectChangesPolicy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 566
diff changeset
636 return new MercurialCollectChangesPolicy(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
637 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
638
312
8deb526363f5 TW-17882 report changes from the merged named branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 309
diff changeset
639
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
640 @NotNull
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
641 public BuildPatchPolicy getBuildPatchPolicy() {
412
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
642 return this;
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
643 }
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
644
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
645 public void buildPatch(@NotNull final VcsRoot root,
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 {
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
650 final HgVcsRoot hgRoot = getHgRoot(root);
641
da9ab34663d8 Do not implement VcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 635
diff changeset
651 buildPatch(hgRoot, fromVersion, toVersion, builder, checkoutRules);
da9ab34663d8 Do not implement VcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 635
diff changeset
652 }
da9ab34663d8 Do not implement VcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 635
diff changeset
653
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
654 public void buildPatch(@NotNull final HgVcsRoot hgRoot,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
655 @Nullable final String fromVersion,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
656 @NotNull final String toVersion,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
657 @NotNull final PatchBuilder builder,
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
658 @NotNull final CheckoutRules checkoutRules) throws IOException, VcsException {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
659 syncRepository(hgRoot);
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
660
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
661 final ChangeSet to = new ChangeSet(toVersion);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
662
412
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
663 if (fromVersion == null) {
444
a05eca69fc01 Ensure plugin works without revnums in revisions
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 441
diff changeset
664 buildFullPatch(hgRoot, to, builder, checkoutRules);
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
665 return;
412
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
666 }
806
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
667
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
668 final ChangeSet from = new ChangeSet(fromVersion);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
669 final HgRepo repo = createRepo(hgRoot);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
670 if (repo.containsRevision(from)) {
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
671 buildIncrementalPatch(hgRoot, from, to, builder, checkoutRules);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
672 return;
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
673 }
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
674
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
675 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
676 cleanCheckoutDir(builder, checkoutRules);
8aeb65cb8ca6 final + invert if
eugene.petrenko@jetbrains.com
parents: 805
diff changeset
677 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
678 }
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
679
5d4351306d57 Build full patch if cannot build incremental one
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 411
diff changeset
680 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
681 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
682 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
683
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
684 private void lockWorkDir(@NotNull File workDir) {
356
53b430731041 TW-19984 ensure map file cleaned as well
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 355
diff changeset
685 myMirrorManager.lockDir(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
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
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
688 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
689 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
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
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
692 @Override
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
693 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
694 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
695 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
696
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
697 @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
698 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
699 File tmpDir = null;
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
700 try {
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
701 tmpDir = createLabelingTmpDir();
775
dd3a471a1188 test added
eugene.petrenko@jetbrains.com
parents: 769
diff changeset
702 HgVcsRoot hgRoot = getHgRoot(root);
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
703 hgRoot.setCustomWorkingDir(tmpDir);
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
704 syncRepository(hgRoot);
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
705 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
706 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
707 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
708
245
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
709 String fixedTagname = fixTagName(label);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
710 repo.tag().revision(version)
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
711 .tagName(fixedTagname)
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
712 .byUser(hgRoot.getUserForTag())
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
713 .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
714
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
715 repo.push().toRepository(hgRoot.getRepository()).call();
245
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
716 return fixedTagname;
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
717 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 474
diff changeset
718 deleteDir(tmpDir, Loggers.VCS);
245
4664e5105633 do labeling in tmp dir
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 244
diff changeset
719 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
720 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
721
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
722 @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
723 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
724 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
725 }
0e21f908b10d TW-28776 create a tag in branch to which the labeled revision belongs
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 590
diff changeset
726
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
727 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
728 // 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
729 // tag name must not contain:
246
8ffe311f9b8e fix comments
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 245
diff changeset
730 // Colon (ASCII 58, ':')
8ffe311f9b8e fix comments
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 245
diff changeset
731 // Carriage return (ASCII 13, '\r')
8ffe311f9b8e fix comments
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 245
diff changeset
732 // 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
733 // 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
734 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
735 }
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
736
635
f0dce200f02a Implement tryMerge
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 634
diff changeset
737 public File getWorkingDir(HgVcsRoot root) {
426
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
738 File customDir = root.getCustomWorkingDir();
c91c4f1ebd53 Settings -> HgVcsRoot
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 425
diff changeset
739 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
740 }
c6de9e076765 add method to get working dir for settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 182
diff changeset
741
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
742
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
743 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
744 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
745 }
241
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
746
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
747
244
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
748 private File createLabelingTmpDir() throws VcsException {
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
749 try {
467
bc2e00800054 TW-22279 use shorter temprorary dir name for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 461
diff changeset
750 return HgFileUtil.createTempDir();
244
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
751 } catch (IOException e) {
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
752 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
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
5496c02d8dc1 Method to create tmp dir for labeling
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 243
diff changeset
756
241
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
757 /* for tests only */
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
758 public MirrorManager getMirrorManager() {
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
759 return myMirrorManager;
ffd7234f9d1f test to reproduce TW-16278
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 226
diff changeset
760 }
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
761
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
762
317
c247d4637a96 Make hg dag-based
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 315
diff changeset
763 @Override
c247d4637a96 Make hg dag-based
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 315
diff changeset
764 public boolean isDAGBasedVcs() {
324
86a668c1c82b Make hg dag-based again
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 323
diff changeset
765 return true;
317
c247d4637a96 Make hg dag-based
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 315
diff changeset
766 }
339
b799355b4016 Merge branch Eluru-6.5.x
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 335 338
diff changeset
767
338
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
768 private static class IgnoreDotHgFilter implements FileFilter {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
769 public boolean accept(final File file) {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
770 return !(file.isDirectory() && ".hg".equals(file.getName()));
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
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
774 private static class AcceptAllFilter implements FileFilter {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
775 public boolean accept(File pathname) {
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
776 return true;
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
777 }
d31d7c81b637 Support subrepositories while building clean patch.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 334
diff changeset
778 }
342
040cd38f6f9e Use factory to create repository state
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
779
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
780 @NotNull
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
781 public ServerHgRepo createRepo(@NotNull HgVcsRoot root) throws VcsException {
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
782 return myRepoFactory.createRepo(root, getWorkingDir(root));
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
783 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
784
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
785 @NotNull
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 541
diff changeset
786 public ServerHgRepo createRepo(@NotNull OperationContext ctx, @NotNull HgVcsRoot root) throws VcsException {
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
787 return ctx.createRepo(root, getWorkingDir(root));
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 541
diff changeset
788 }
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 541
diff changeset
789
769
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
790 @NotNull
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
791 public ServerHgRepo createRepo(@NotNull HgVcsRoot root, @NotNull File customDir) throws VcsException {
50a9c2e1f0a9 simplify 2
eugene.petrenko@jetbrains.com
parents: 753
diff changeset
792 return myRepoFactory.createRepo(root, customDir);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
793 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 397
diff changeset
794
342
040cd38f6f9e Use factory to create repository state
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
795 @NotNull
411
490024d8e5fd Test patch from newer revision to earlier
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 408
diff changeset
796 @Override
439
f957619d2b04 method renamed
Pavel.Sher
parents: 436
diff changeset
797 public Map<String, String> getCheckoutProperties(@NotNull VcsRoot root) {
416
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
798 Map<String, String> rootProperties = root.getProperties();
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
799 Map<String, String> repositoryProperties = new HashMap<String, String>();
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
800 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
801 repositoryProperties.put(Constants.INCLUDE_SUBREPOS_IN_PATCH, rootProperties.get(Constants.INCLUDE_SUBREPOS_IN_PATCH));
416
9a467ce09cbd Fix repository properties calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 415
diff changeset
802 return repositoryProperties;
411
490024d8e5fd Test patch from newer revision to earlier
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 408
diff changeset
803 }
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
804
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
805
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
806 @Override
435
4b6cca841ea5 New list files API
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 430
diff changeset
807 public ListFilesPolicy getListFilesPolicy() {
667
bcee3a8b2c7b Add TTL for list file policy
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 652
diff changeset
808 return new ListFilesSupport(this, myConfig, myHgVcsRootFactory);
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
809 }
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
810
678
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
811 @NotNull
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
812 public UrlSupport getUrlSupport() {
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
813 return new MercurialUrlSupport(this);
fd0c1e91bd46 mercurial url support + some tests
Pavel Sher <pavel.sher@gmail.com>
parents: 675
diff changeset
814 }
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
815
522
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
816 @Override
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
817 @Nullable
522
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
818 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
819 for (MercurialServerExtension e : myExtensions) {
522
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
820 if (extensionClass.isInstance(e))
686b04d58c6e Use a new way to provide vcs extensions
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 519
diff changeset
821 return extensionClass.cast(e);
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
822 }
652
99bee7b19368 call super in getVcsCustomExtension
eugene.petrenko@gmail.com
parents: 641
diff changeset
823 return super.getVcsCustomExtension(extensionClass);
489
493f78cb64dd Move MercurialBranchSupport to separate module
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 485
diff changeset
824 }
782
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
825
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
826
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
827 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
828 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
829 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
830 }
44b15b5a87e8 VCS-41 use archive to build an incremental patch
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 775
diff changeset
831 }
174
2faaa84c0896 Fix TW-15195: Add option in UI to do --uncompressed clone.
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 165 169
diff changeset
832 }