annotate mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/HgRepo.java @ 980:1168c4c64d49

Merge branch Indore-2017.2.x
author Dmitry Neverov <dmitry.neverov@gmail.com>
date Wed, 24 Jan 2018 17:38:56 +0100
parents 7bf4d943d5bb 38adef4f1b8f
children 10dc26b32c35
rev   line source
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
1 /*
977
38adef4f1b8f Update copyright
pavel.sher
parents: 913
diff changeset
2 * Copyright 2000-2018 JetBrains s.r.o.
732
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
3 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
5 * you may not use this file except in compliance with the License.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
6 * You may obtain a copy of the License at
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
7 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
9 *
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
10 * Unless required by applicable law or agreed to in writing, software
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
11 * distributed under the License is distributed on an "AS IS" BASIS,
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
13 * See the License for the specific language governing permissions and
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
14 * limitations under the License.
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
15 */
31a1aca3305c Update copyright
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 730
diff changeset
16
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
17 package jetbrains.buildServer.buildTriggers.vcs.mercurial;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
18
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
19 import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*;
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 472
diff changeset
20 import jetbrains.buildServer.log.Loggers;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
21 import jetbrains.buildServer.util.FileUtil;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
22 import jetbrains.buildServer.vcs.VcsException;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
23 import org.jetbrains.annotations.NotNull;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
24
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
25 import java.io.File;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
26 import java.io.IOException;
838
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
27 import java.util.ArrayList;
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
28 import java.util.HashMap;
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
29 import java.util.List;
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
30 import java.util.Map;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
31
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
32 import static java.util.Arrays.asList;
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
33 import static java.util.Collections.emptyList;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
34 import static java.util.Collections.emptyMap;
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 472
diff changeset
35 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil.deleteDir;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
36 import static jetbrains.buildServer.util.FileUtil.isEmptyDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
37
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
38 /**
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
39 * @author dmitry.neverov
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
40 */
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
41 public class HgRepo {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
42
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
43 protected final CommandSettingsFactory myCommandSettingsFactory;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
44 protected final File myWorkingDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
45 protected final String myHgPath;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
46 protected final AuthSettings myAuthSettings;
600
6c480513e5c2 Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 587
diff changeset
47 protected final Map<String, Map<String, SubRepo>> mySubreposCache = new HashMap<String, Map<String, SubRepo>>();
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
48
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
49 public HgRepo(@NotNull CommandSettingsFactory commandSettingsFactory,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
50 @NotNull File workingDir,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
51 @NotNull String hgPath,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
52 @NotNull AuthSettings authSettings) {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
53 myCommandSettingsFactory = commandSettingsFactory;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
54 myWorkingDir = workingDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
55 myHgPath = hgPath;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
56 myAuthSettings = authSettings;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
57 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
58
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
59 public PullCommand pull() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
60 return new PullCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
61 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
62
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
63 public PushCommand push() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
64 return new PushCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
65 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
66
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
67 public CloneCommand doClone() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
68 return new CloneCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
69 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
70
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
71 public IdentifyCommand id() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
72 return new IdentifyCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
73 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
74
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
75 public Init init() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
76 return new Init(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
77 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
78
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
79 public LogCommand log() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
80 return new LogCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
81 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
82
720
69bb18514349 register command
eugene.petrenko@jetbrains.com
parents: 649
diff changeset
83 @NotNull
69bb18514349 register command
eugene.petrenko@jetbrains.com
parents: 649
diff changeset
84 public CommitsAndMountPointsCommand logSubstates() throws VcsException {
742
091667cc54d5 assert HG version is supported for the command
eugene.petrenko@jetbrains.com
parents: 732
diff changeset
85 return new CommitsAndMountPointsCommand(this, myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
720
69bb18514349 register command
eugene.petrenko@jetbrains.com
parents: 649
diff changeset
86 }
69bb18514349 register command
eugene.petrenko@jetbrains.com
parents: 649
diff changeset
87
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
88 public UpdateCommand update() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
89 return new UpdateCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
90 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
91
911
15fce0c26e18 TW-39321 create branch for commit if repository has no branches
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 870
diff changeset
92 public BranchCommand branch() {
15fce0c26e18 TW-39321 create branch for commit if repository has no branches
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 870
diff changeset
93 return new BranchCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
15fce0c26e18 TW-39321 create branch for commit if repository has no branches
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 870
diff changeset
94 }
15fce0c26e18 TW-39321 create branch for commit if repository has no branches
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 870
diff changeset
95
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
96 public BranchesCommand branches() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
97 return new BranchesCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
98 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
99
529
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
100 public BookmarksCommand bookmarks() {
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
101 return new BookmarksCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
102 }
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
103
749
63babe8e01a1 support auto-merge for bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 742
diff changeset
104 public UpdateBookmarkCommand updateBookmark() {
63babe8e01a1 support auto-merge for bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 742
diff changeset
105 return new UpdateBookmarkCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
63babe8e01a1 support auto-merge for bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 742
diff changeset
106 }
63babe8e01a1 support auto-merge for bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 742
diff changeset
107
649
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
108 public TagsCommand tags() {
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
109 return new TagsCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
110 }
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
111
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
112 public Map<String, String> getBranchRevisions(boolean includeBookmarks, boolean includeTags) throws VcsException {
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
113 Map<String, String> revisions = new HashMap<String, String>();
649
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
114 if (includeTags)
0b50d7952a7d TW-23468 support tags as branches
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 645
diff changeset
115 revisions.putAll(tags().call());
645
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
116 if (includeBookmarks && version().call().isEqualsOrGreaterThan(BookmarksCommand.REQUIRED_HG_VERSION))
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
117 revisions.putAll(bookmarks().call());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
118 revisions.putAll(branches().call());
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
119 return revisions;
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
120 }
4cf1ab3cd162 Merge in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 631
diff changeset
121
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
122 public StatusCommand status() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
123 return new StatusCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
124 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
125
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
126 public TagCommand tag() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
127 return new TagCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
128 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
129
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
130 public CatCommand cat() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
131 return new CatCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
132 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
133
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
134 public ArchiveCommand archive() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
135 return new ArchiveCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, myAuthSettings);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
136 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
137
432
4a76645fe087 TW-21516 hg version detection should not depend on locale settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
138 public VersionCommand version() {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
139 return new VersionCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
432
4a76645fe087 TW-21516 hg version detection should not depend on locale settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
140 }
4a76645fe087 TW-21516 hg version detection should not depend on locale settings
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
141
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
142 public ParentsCommand parents() {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
143 return new ParentsCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
144 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
145
631
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
146 public MergeCommand merge() {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
147 return new MergeCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
148 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
149
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
150 public ResolveCommand resolve() {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
151 return new ResolveCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
152 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
153
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
154 public CommitCommand commit() {
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
155 return new CommitCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
156 }
d28d52336ce5 Implement MergeSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 600
diff changeset
157
867
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
158 public AddRemoveCommand addRemove() {
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
159 return new AddRemoveCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
160 }
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
161
913
ed4ae4bfd691 TW-39482 recover from abandoned transaction error in local mirror
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 911
diff changeset
162 public RecoverCommand recover() {
ed4ae4bfd691 TW-39482 recover from abandoned transaction error in local mirror
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 911
diff changeset
163 return new RecoverCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
ed4ae4bfd691 TW-39482 recover from abandoned transaction error in local mirror
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 911
diff changeset
164 }
ed4ae4bfd691 TW-39482 recover from abandoned transaction error in local mirror
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 911
diff changeset
165
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
166 public String path() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
167 return myWorkingDir.getAbsolutePath();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
168 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
169
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
170 public File getWorkingDir() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
171 return myWorkingDir;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
172 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
173
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
174 public boolean isEmpty() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
175 return isEmptyDir(myWorkingDir);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
176 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
177
867
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
178 public boolean isBookmark(@NotNull String branch) throws VcsException {
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
179 if (branches().call().keySet().contains(branch))
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
180 return false;
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
181 return bookmarks().call().keySet().contains(branch);
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
182 }
80d695d15cc0 Add CommitSupport
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 854
diff changeset
183
529
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
184 public void resetBookmarks() {
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
185 File dotHg = new File(getWorkingDir(), ".hg");
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
186 FileUtil.delete(new File(dotHg, "bookmarks"));
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
187 FileUtil.delete(new File(dotHg, "bookmarks.current"));
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
188 }
33a6be414903 TW-17489 support bookmarks
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 521
diff changeset
189
834
80ae3dc66685 TW-18605 add support for 'hg purge'
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 817
diff changeset
190 public PurgeCommand purge() {
80ae3dc66685 TW-18605 add support for 'hg purge'
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 817
diff changeset
191 return new PurgeCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir);
80ae3dc66685 TW-18605 add support for 'hg purge'
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 817
diff changeset
192 }
80ae3dc66685 TW-18605 add support for 'hg purge'
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 817
diff changeset
193
854
3a418ac5ada1 Ability to run any hg command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 838
diff changeset
194 @NotNull
3a418ac5ada1 Ability to run any hg command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 838
diff changeset
195 public CommandResult runCommand(@NotNull String command, @NotNull String... args) throws VcsException {
3a418ac5ada1 Ability to run any hg command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 838
diff changeset
196 return new FreeStyleCommand(myCommandSettingsFactory.create(), myHgPath, myWorkingDir, command, args).call();
3a418ac5ada1 Ability to run any hg command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 838
diff changeset
197 }
3a418ac5ada1 Ability to run any hg command
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 838
diff changeset
198
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
199 public String getHgPath() {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
200 return myHgPath;
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
201 }
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
202
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
203 @NotNull
472
6d4ce78234c5 TW-23435 list files should take VCS root branch into account
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 433
diff changeset
204 public List<String> listFiles(@NotNull String revision) throws VcsException {
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
205 List<FileStatus> fileStatuses = status()
472
6d4ce78234c5 TW-23435 list files should take VCS root branch into account
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 433
diff changeset
206 .fromRevision(revision)
6d4ce78234c5 TW-23435 list files should take VCS root branch into account
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 433
diff changeset
207 .toRevision(revision)
425
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
208 .hideStatus()
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
209 .showAllFiles()
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
210 .call();
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
211 List<String> files = new ArrayList<String>(fileStatuses.size());
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
212 for (FileStatus fileStatus : fileStatuses)
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
213 files.add(fileStatus.getPath());
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
214 return files;
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
215 }
e33c3e4918f5 Add list files support
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
216
838
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
217 @NotNull
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
218 public String getWorkingDirRevision() throws VcsException {
838
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
219 List<String> workingDirParents = parents().call();
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
220 if (workingDirParents.isEmpty())
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
221 return LogCommand.ZERO_PARENT_SHORT_ID;//'hg id' shows zeroid when a working dir has no parents
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
222 //if a working dir is in an uncommitted merge state, choose the first parent
7e461ea697f1 Faster working dir revision calculation
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 834
diff changeset
223 return workingDirParents.get(0);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
224 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
225
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
226 public boolean containsRevision(@NotNull String revision) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
227 return containsRevision(new ChangeSet(revision));
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
228 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
229
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
230 public boolean containsRevision(@NotNull ChangeSet cset) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
231 try {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
232 id().revision(cset).inLocalRepository().call();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
233 return true;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
234 } catch (VcsException e) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
235 return false;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
236 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
237 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
238
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
239 public boolean isValidRepository() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
240 // need better way to check that repository copy is ok
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
241 return myWorkingDir.isDirectory() && new File(myWorkingDir, ".hg").isDirectory();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
242 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
243
520
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
244 public void setDefaultPath(@NotNull String defaultPath) throws VcsException {
968
2a8670c6afa9 Prohibit newlines in repository url
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 913
diff changeset
245 if (defaultPath.contains("\n") || defaultPath.contains("\r"))
2a8670c6afa9 Prohibit newlines in repository url
Dmitry Neverov <dmitry.neverov@gmail.com>
parents: 913
diff changeset
246 throw new VcsException("Newline in repository url '" + defaultPath + "'");
520
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
247 try {
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
248 File hgrc = new File(new File(myWorkingDir, ".hg"), "hgrc");
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
249 String content = "%include " + Constants.TEAMCITY_HG_CONFIG_FILE_NAME + "\n\n[paths]\ndefault = " + defaultPath;
520
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
250 FileUtil.writeFileAndReportErrors(hgrc, content);
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
251 } catch (IOException e) {
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
252 throw new VcsException(e);
1ca68585ffce Support mirrors for subrepos with relative paths
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
253 }
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
254 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
255
870
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
256 public void setTeamCityConfig(@NotNull String configContent) throws VcsException {
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
257 try {
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
258 File teamcityConfig = new File(new File(myWorkingDir, ".hg"), Constants.TEAMCITY_HG_CONFIG_FILE_NAME);
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
259 FileUtil.writeFileAndReportErrors(teamcityConfig, configContent);
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
260 } catch (IOException e) {
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
261 throw new VcsException(e);
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
262 }
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
263 }
6df89e185a3c TW-19916 ability to specify custom mercurial config for VCS root
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 867
diff changeset
264
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
265 public boolean hasSubreposAtRevision(@NotNull String revision) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
266 return !getSubrepositories(new ChangeSet(revision)).isEmpty();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
267 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
268
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
269 public boolean hasSubreposAtRevision(@NotNull ChangeSet cset) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
270 return !getSubrepositories(cset).isEmpty();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
271 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
272
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
273 public Map<String, SubRepo> getSubrepositories(@NotNull String revision) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
274 return getSubrepositories(new ChangeSet(revision));
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
275 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
276
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
277 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull String revision) throws VcsException {
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
278 if (containsSubrepoConfigChange(revision)) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
279 List<String> parents = parents().ofRevision(revision).call();
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
280 return getSubrepoConfigChanges(revision, parents);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
281 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
282 return emptyList();
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
283 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
284
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
285 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull ChangeSet cset) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
286 if (containsSubrepoConfigChange(cset)) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
287 List<String> parents = new ArrayList<String>();
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
288 for (ChangeSetRevision p : cset.getParents()) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
289 parents.add(p.getId());
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
290 }
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
291 return getSubrepoConfigChanges(cset.getId(), parents);
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
292 }
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
293 return emptyList();
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
294 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
295
587
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
296 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull String fromRevision, @NotNull String toRevision) {
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
297 return getSubrepoConfigChanges(toRevision, asList(fromRevision));
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
298 }
e77ef6cd4ddb Incremental patch for VCS root with subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 585
diff changeset
299
585
d1203382ce76 Collect subrepo changes from first parent commit
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 566
diff changeset
300 public List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull String revision, @NotNull List<String> parentRevisions) {
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
301 Map<String, SubRepo> curSubrepos = getSubrepositories(revision);
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
302 List<Map<String, SubRepo>> prevSubrepos = new ArrayList<Map<String, SubRepo>>();
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
303 for (String parentRevision : parentRevisions) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
304 prevSubrepos.add(getSubrepositories(parentRevision));
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
305 }
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
306 return getSubrepoConfigChanges(revision, prevSubrepos, curSubrepos);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
307
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
308 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
309
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
310 private List<HgSubrepoConfigChange> getSubrepoConfigChanges(@NotNull String mainRepoRevision,
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
311 @NotNull List<Map<String, SubRepo>> prevSubrepos,
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
312 @NotNull Map<String, SubRepo> curSubrepos) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
313 List<HgSubrepoConfigChange> configChanges = new ArrayList<HgSubrepoConfigChange>();
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
314 for (Map.Entry<String, SubRepo> e : curSubrepos.entrySet()) {
554
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
315 String path = e.getKey();
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
316 SubRepo curSubrepo = e.getValue();
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
317 List<SubRepo> prevs = new ArrayList<SubRepo>();
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
318 for (Map<String, SubRepo> prev : prevSubrepos) {
554
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
319 SubRepo prevSubrepo = prev.remove(path);
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
320 if (prevSubrepo == null) //no subrepo at this path in previous revision
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
321 continue;
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
322 if (prevSubrepo.equals(curSubrepo)) //subrepo configuration doesn't change since previous revision
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
323 continue;
110de749f460 Collect subrepo changes only if subrepo revision changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 548
diff changeset
324 prevs.add(prevSubrepo);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
325 }
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
326 configChanges.add(new HgSubrepoConfigChange(mainRepoRevision, e.getKey(), prevs, curSubrepo));
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
327 }
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
328 for (Map<String, SubRepo> prev : prevSubrepos) {
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
329 for (Map.Entry<String, SubRepo> e : prev.entrySet()) {
697
d1469a7cc038 Skip collecting changes in subrepos which url cannot be resolved
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 649
diff changeset
330 configChanges.add(new HgSubrepoConfigChange(mainRepoRevision, e.getKey(), e.getValue(), null));
548
6c8911ed66f2 Report subrepo changes
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 529
diff changeset
331 }
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
332 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
333 return configChanges;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
334 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
335
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
336 private boolean containsSubrepoConfigChange(@NotNull ChangeSet cset) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
337 for (FileStatus f : cset.getModifiedFiles()) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
338 if (containsSubrepoConfigChange(f))
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
339 return true;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
340 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
341 return false;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
342 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
343
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
344 private boolean containsSubrepoConfigChange(@NotNull String revision) throws VcsException {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
345 List<FileStatus> changedFiles = status()
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
346 .fromRevision(revision)
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
347 .toRevision(revision)
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
348 .showAllFiles()
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
349 .call();
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
350 for (FileStatus f : changedFiles) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
351 if (containsSubrepoConfigChange(f))
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
352 return true;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
353 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
354 return false;
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
355 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
356
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
357 private boolean containsSubrepoConfigChange(@NotNull FileStatus f) {
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
358 return f.getPath().equals(".hgsubstate");
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
359 }
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
360
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
361 //path->subrepo
817
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
362 @NotNull
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
363 public Map<String, SubRepo> getSubrepositories(@NotNull final ChangeSet cset) {
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
364 final String revId = cset.getId();
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
365
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
366 Map<String, SubRepo> subrepos = mySubreposCache.get(revId);
817
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
367 if (subrepos != null) {
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
368 return new HashMap<String, SubRepo>(subrepos);
817
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
369 }
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
370
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
371 File catDir = null;
817
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
372 final CatCommand cc = cat().setRevId(revId).files(asList(".hgsub", ".hgsubstate")).checkForFailure(false);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
373 try {
817
25482087e9b5 use only execute to call the cat command
eugene.petrenko@jetbrains.com
parents: 749
diff changeset
374 catDir = cc.call();
723
860021731792 inline usage
eugene.petrenko@jetbrains.com
parents: 722
diff changeset
375 subrepos = HgSubs.readSubrepositories(new File(catDir, ".hgsub"), new File(catDir, ".hgsubstate"));
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
376 mySubreposCache.put(revId, subrepos);
511
f2666e817701 Detect changes in subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 480
diff changeset
377 return new HashMap<String, SubRepo>(subrepos);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
378 } catch (VcsException e) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
379 return emptyMap();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
380 } finally {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 472
diff changeset
381 deleteDir(catDir, Loggers.VCS);
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
382 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
383 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
384
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
385 @Override
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
386 public String toString() {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
387 return myWorkingDir.getAbsolutePath();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
388 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
389
725
9e4c8cd92838 added shortId util
eugene.petrenko@jetbrains.com
parents: 723
diff changeset
390 @NotNull
9e4c8cd92838 added shortId util
eugene.petrenko@jetbrains.com
parents: 723
diff changeset
391 public static String shortId(@NotNull final String s) {
9e4c8cd92838 added shortId util
eugene.petrenko@jetbrains.com
parents: 723
diff changeset
392 if (s.length() > 12)
9e4c8cd92838 added shortId util
eugene.petrenko@jetbrains.com
parents: 723
diff changeset
393 return s.substring(0, 12);
9e4c8cd92838 added shortId util
eugene.petrenko@jetbrains.com
parents: 723
diff changeset
394 return s;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
395 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents:
diff changeset
396 }